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 ...
随机推荐
- android ListView_新闻案例
xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...
- Repost: Set Delivery Block on SO
If SO is incomplete, then automatically set the delivery block on the SO header. as suggested by ear ...
- centos6.5安装flume
这里安装flume是因为游戏业务日志搜集和分析用的 1.安装java 环境rpm -ivh jdk-8u51-linux-x64.rpm Preparing... ################## ...
- Chipscope 仿真VmodCAM IIC程序
Chipscope 仿真VmodCAM IIC程序: 目的:熟悉EDK中建立chipscope 注意:zedboard使用digilent USB下载时,chipscope不能和SDK同时使用,否则芯 ...
- PHP 如何判断当前用户已在别处登录
出处:http://bbs.lampbrother.net/read-htm-tid-121909-ds-1.html#tpc 主要思路:1.登录时,将用户的SessionID记录下来2.验证登录时, ...
- 使用socket.io搭建聊天室
最近在学习nodejs,需要找一些项目练练手.找来找去发现了一个聊天室的教程,足够简单,也能从中学到一些东西.下面记录我练习过程中待一些笔记. nodeJS模块 共用到了2个模块,express和so ...
- 12个git实战建议和技巧
摘要:git无疑是现在最热门的版本控制工具,而且正在进一步侵占SVN以及CVS的市场.本文作者从国外技术问答社区Stack Overflow整理的12个很实用的git使用技巧和建议,希望对你有帮助. ...
- [转]AIX下调整分区大小
AIX下调整文件系统大小 - [work] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://wangsuiri.blogbus.com/logs/35448074.htm ...
- hdu 5545 The Battle of Guandu spfa最短路
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5545 题意:有N个村庄, M 个战场: $ 1 <=N,M <= 10^5 $; 其中曹 ...
- 拥抱ARM妹纸第二季 之 第二次 约会需要浪漫,这么大灯泡怎么弄?
终于轮到俺的小穆出场啦.有请能让太阳也为之暗淡的小穆闪亮登场-,鼓掌吧,欢呼吧!-- ♪♪ We can burn brighter Than the sun ~~~ ♪♪ “谢谢---“ 唱的太棒啦 ...