总时间限制: 1000ms  内存限制: 65536kB
描述
The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next: 

Expression:( V | V ) & F & ( F | V )

where V is for True, and F is for False. The expressions may include the following operators: ! for not , & for and, | for or , the use of parenthesis for operations grouping is also allowed.
To perform the evaluation of an expression, it will be considered the priority of the operators, the not having the highest, and the or the lowest. The program must yield V or F , as the result for each expression in the input file. 
输入
The expressions are of a variable length, although will never exceed 100 symbols. Symbols may be separated by any number of spaces or no spaces at all, therefore, the total length of an expression, as a number of characters, is unknown. 
The number of expressions in the input file is variable and will never be greater than 20. Each expression is presented in a new line, as shown below. 
输出
For each test expression, print "Expression " followed by its sequence number, ": ", and the resulting value of the corresponding test expression. Separate the output for consecutive test expressions with a new line. 
Use the same format as that shown in the sample output shown below. 
样例输入
( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))

样例输出

Expression : F
Expression : V
Expression : V

解题思路

一开始看到这题就觉得要用栈,毕竟是表达式求值问题,但是自己的中缀表达式求值也没练过,而且这次的课程作业又是练习递归,于是就尝试了递归解法。

但是入门太浅,还是搞不懂递归思路,很难从一个表达式中进行结构的分解,逻辑梳理能力太差。

下面是大佬的代码,真心膜拜,希望我的代码能力能越来越好。

#include<iostream>
using namespace std; bool f1();
bool f2(); char getc_() //读入一个非空格字符
{
char c;
while ((c = cin.get()) == ' ');
return c;
}
char peekc_()//读到第一个非空格字符前停止
{
char c;
while ((c = cin.peek()) == ' ')
{
cin.get();
}
return c;
} bool f2()//计算项
{
char c = peekc_();
if (c == '(')
{
getc_(); //拿走左括号
bool d = f1();
getc_(); //拿走右括号
return d;
}
else
{
getc_();
if (c == '!') return !f2();//运算符作用于下一个对象
if (c == 'V') return true;
if (c == 'F') return false;
}
} bool f1()//计算整个表达式
{
char c = peekc_();
if (c == '\n') return false;
bool a = f2();
while (true)
{
c = peekc_();
if (c == '|')
{
getc_();
bool b = f2();
a = a || b;
}
else if (c == '&')
{
getc_();
bool b = f2();
a = a && b;
}
else break;
}
return a;
}
int main()
{
int n = ;
while (cin.peek() != EOF) {
bool f = f1();
if (cin.peek() == '\n' || cin.peek() == EOF) {
cout << "Expression " << ++n << ": " << (f ? 'V' : 'F') << endl;
cin.get();//清理换行符和结束符
}
}
return ;
}

引用网址:

https://blog.csdn.net/chuxin126/article/details/55105076

POJ 2106 Boolean Expressions的更多相关文章

  1. [poj 2106] Boolean Expressions 递归

    Description The objective of the program you are going to produce is to evaluate boolean expressions ...

  2. (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)

    /* * POJ_2106.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...

  3. POJ 2106 Boolean Expressions (布尔表达式求值)

    题意:关于!,&,| 的运算,表达式中V代表true,F代表false. 思路:见代码吧,很详细了. 要注意 !!!F,!(...) 的情况. #include <iostream> ...

  4. poj 2106 Boolean Expressions 课本代码

    #include<cstdio> const int maxn=100 +10; int val[maxn],vtop; int op[maxn],otop; void insert(in ...

  5. Boolean Expressions POJ - 2106 (表达式求值)

    The objective of the program you are going to produce is to evaluate boolean expressions as the one ...

  6. POJ | Boolean Expressions

    总时间限制: 1000ms  内存限制: 65536kB 描述The objective of the program you are going to produce is to evaluate ...

  7. Boolean Expressions

    Boolean Expressions Time Limit: 1000MS   Memory Limit: 30000K       Description The objective of the ...

  8. shorthand trick with boolean expressions

    https://stackoverflow.com/questions/2802055/what-does-the-construct-x-x-y-mean --------------------- ...

  9. POJ 2106-Boolean Expressions,双栈运用类似表达式求值!

    Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...

随机推荐

  1. ElementUI——动态表单验证

    前言 版本更新迭代的时候,需要用到一个动态表单的功能,ElementUI刚好有教程就改改用咯 步骤 代码 <!-- 手机副号动态表单框 --> <el-form-item v-for ...

  2. (2)ESP8266 矩阵的逆求解

    #include "math.h" int N=4; int M=4; float a[4][4]={ {1,0,0,0}, {1,0.5,0,0}, {1,0,1,0}, {1, ...

  3. js之大文件分段上传、断点续传

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  4. am335x system upgrade kernel ethernet(四)

    1      Scope of Document This document describes ethernet hardware design and porting KZS8081 to ubo ...

  5. windows 获取时间戳

    Windows 批处理时间戳 1.时间戳格式: 取年份: echo %date:~,% 取月份: echo %date:~,% 取日期: echo %date:~,% 取星期: echo %date: ...

  6. 原生 ajax 请求

    ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...

  7. 72: libreoj #10147 区间dp

    $des$ 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数 nnn 及每堆的石子数 ...

  8. Android入门教程(八)

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号  欢迎大家关注我的微信公众号:「醉翁猫咪」 今天讲讲安卓入门(八),讲讲Android的简介,如何搭建An ...

  9. vue子组件与子组件之前传值-----最简单办法

    1.在main.js中定义一个值(红色为重点) new Vue({ el: '#app', data: { Bus: new Vue() }, router, store, render: h =&g ...

  10. Java 12 骚操作, 文件比对居然还能这样玩!

    Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 之前分享了一些 Java 12 的骚操作,今天继续,今天要分享的是 Java 12 中的文件比对骚操作. ...