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 ...
- ResourceBundle和Properties(转载)
转载: 一般来说,ResourceBundle类通常是用于针对不同的语言来使用的属性文件. 而如果你的应用程序中的属性文件只是一些配置,并不是针对多国语言的目的.那么使用Properties类就可以了 ...
- 在项目中 background transiton 带来的"便利"与“坑”
本文就两个例子跟大家分享一下background-image与background-size的渐变(transition)所带来的方便与“深坑” 首选,说说这东西好的地方,有时候在做PC项目的时候,可 ...
- [转]PHP中fopen,file_get_contents,curl的区别
1. fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存.但是CURL会自动对DNS信息进行缓存.对同一域名下的网页或者图片的请求只 ...
- phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析
在了解index.php中的init函数的时候,让我们先看看最开始的几行代码 1-5 第二行, defined('IN_PHPCMS') or exit('Nopermission resource ...
- mysql命令语句来去除掉字段中空格字符的方法
mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数. ...
- DataSnap中连接池的应用
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接.这样做将产生大量的数据库连接,并产生很多问题.从Delphi XE开始,EMB提供了Sess ...
- SQL中的类型转换
SQL中的类型转换一直是以块心病,因为用得比较少,所以每次想用的时候都要想半天,恰好这段时间比较空,整理整理.今天写个标题先.
- 5、WPF实现简单计算器-非常适合初学者练习
Sample Calculator 这是微软社区WPF的一个示例,在源程序的基础上我进行了一点点修改,非常适合初学者练习,详细代码解释. 源程序的下载地址 http://code.msdn.micro ...
- hdu 2256 Problem of Precision 构造整数 + 矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:给定 n 求解 ? 思路: , 令 , 那么 , 得: 得转移矩阵: 但是上面求出来的并 ...