POJ 2106 Boolean Expressions (布尔表达式求值)
题意:关于!,&,| 的运算,表达式中V代表true,F代表false。
思路:见代码吧,很详细了。
要注意 !!!F,!(...) 的情况。
#include <iostream>
#include <stdio.h>
#include <stack>
#include <string.h>
#include <map> using namespace std;
const int maxn=;
stack<int> val; //存储操作数和中间运算结果
stack<char> op; //存储运算符
map<char,int> maps; //存储相应运算符的优先级,数值大代表优先级高 //求!a
void opNot(int a){
while(!op.empty() && op.top()=='!') {
op.pop();
a=!a;
}
val.push(a);
}
int main() {
char ch;
int a,b,t=;
maps['!']=;maps['&']=;maps['|']=;
while((ch=getchar())!=EOF) {
t++;
while(!val.empty())
val.pop();
while(!op.empty())
op.pop();
do {
if(ch==' ')
continue;
/*
遇到V\F,查看之前的表达式中(即栈op中)是否存在优先级高的单目运算符!。
若存在,将这些单目运算符出op栈,对操作数进行相应的运算,再将运算结果压入val栈
*/
if(ch=='V') {
a=;
opNot(a);
} else if(ch=='F') {
a=;
opNot(a);
}
//若遇到(,直接入op栈
else if(ch=='(') {
op.push('(');
}
/*
当遇到'(',将op中的运算符出栈,并将val栈中退出两个操作数,求值后将结果如val栈
直至遇到'('结束。这里不需要考虑运算符为!的情况,因为之前肯定已经处理过了。 这里还要注意的是,很有可能在'('前有!运算符,所以再求出(...)内的值后,不能就以为ok了。
还要判断op栈顶上是否存在'!',若存在,还要对结果取!。
*/
else if(ch==')') {
//一开始忽略了有!(...)情况,导致一直WA。。。
while(op.top()!='(') {
a=val.top();
val.pop();
b=val.top();
val.pop();
if(op.top()=='|')
val.push(a|b);
else
val.push(a&b); op.pop();
}
op.pop(); //将'('出栈
//若(...)前有!,则将括号算出来的结果取!
while(!op.empty() && op.top()=='!'){
op.pop();
a=val.top();
val.pop();
val.push(!a);
}
} else {
/*
若ch为'!',则不执行while循环,直接入op栈。
若ch是其它双目运算符,则计算op栈顶中优先级比ch高的双目运算符。
每弹出其中一个,从val栈顶退出两个操作数a,b,求结果后入val栈。
进行完所有op栈顶中优先级比ch高的双目运算符后,再将ch压入op栈
*/
while(!op.empty() && op.top()!='(' && op.top()!='!' && maps[op.top()]>=maps[ch]) {
a=val.top();
val.pop();
b=val.top();
val.pop();
if(op.top()=='|')
val.push(a|b);
else
val.push(a&b);
op.pop();
}
op.push(ch); //一开始都忘记把ch入栈了。。。
}
} while((ch=getchar())!='\n' && ch!=EOF);
/*
扫描完所有表达式后,若op栈中还有运算符,则继续计算。
本来此处还考虑了万一有'!'运算符的情况,后来把这部分代码删了,提交后仍AC,
想了想,确实如果有'!',也早就在之前就已经处理了。
*/
while(!op.empty()) {
ch=op.top();
op.pop();
a=val.top();
val.pop();
b=val.top();
val.pop();
if(ch=='|')
val.push(a|b);
else
val.push(a&b);
}
if(val.top()==)
ch='V';
else
ch='F';
printf("Expression %d: %c\n",t,ch);
} return ;
}
POJ 2106 Boolean Expressions (布尔表达式求值)的更多相关文章
- (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)
/* * POJ_2106.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...
- [poj 2106] Boolean Expressions 递归
Description The objective of the program you are going to produce is to evaluate boolean expressions ...
- POJ 2106 Boolean Expressions
总时间限制: 1000ms 内存限制: 65536kB 描述 The objective of the program you are going to produce is to evaluate ...
- poj 2106 Boolean Expressions 课本代码
#include<cstdio> const int maxn=100 +10; int val[maxn],vtop; int op[maxn],otop; void insert(in ...
- Boolean Expressions POJ - 2106 (表达式求值)
The objective of the program you are going to produce is to evaluate boolean expressions as the one ...
- POJ 2106-Boolean Expressions,双栈运用类似表达式求值!
Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...
- 在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser.DynamicExpresso.Z.Expressions,它们各自功能 ...
- POJ | Boolean Expressions
总时间限制: 1000ms 内存限制: 65536kB 描述The objective of the program you are going to produce is to evaluate ...
- 利用Z.Expressions.Eval表达式求值
Z.Expression.Eval是一个开源的(OpenSource),可扩展的(Extensible),超轻量级(Super lightweight)的公式化语言解析执行工具包. 使用方法:1.从n ...
随机推荐
- GCD Block
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- 实验九--裸机LCD
一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...
- 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时)
今天忽然间发现远程连接别人数据库会出现 已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时) 这种情况 ...
- dmp文件导入
dmp文件导入 1,打开“开始”-->输入cmd—> sqlplus log: 2,输入 conn / as sysdba管理员账户登录: 3,需要创建表空间,如果我们知道需要导入的数据库 ...
- 解决nginx负载均衡的session共享问题
1.不使用session,换用cookie session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站. ...
- C# 访问控制:public、private、protected和internal
平日工作时最常用的访问控制符是public和private,当看到prism里面大量使用protected的时候,觉得还是不太理解为啥. 所以就静下心来查找并理解了一下,这里记录下,以便回顾和交流. ...
- Makefile之wildcard
1.wildcard : 扩展通配符2.notdir : 去除路径3.patsubst :替换通配符 例子:建立一个测试目录,在测试目录下建立一个名为sub的子目录$ mkdir test$ cd t ...
- 编译linux内核问题
1: openssl/opensslv.h: No such file or directory sudo apt-get install libssl-dev 2:一般配置内核树,需要先make o ...
- cocos2.2.3中创建精灵对象的三大类方法
1.众生相,皆精灵 2.精灵的类继承关系 class CCSprite : public CCNode, public CCNodeRGBA, public CCTextureProtocol 3.创 ...
- linux作业六——进程的描述和进程的创建
进程的描述和进程的创建 一.进程描述符task_struct 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 代码关键点: 1.Struct list_hea ...