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 ...
随机推荐
- 了解GDAL的图像处理/Python
GDAL是一个操作各种栅格地理数据格式的库.包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格, ...
- java和javascript中this区别的浅探讨
今天在学习javascript的时候碰到了this,感觉它跟java里的有点不一样.然后上网查了一下,参考了这篇文章,JavaScript中this关键字详解,发现它们之间的区别主要是这样: java ...
- jquery的 $(function(){ }) = $(document).ready(function(){ }) ,及页面的加载顺序
document.ready和onload的区别:一.JavaScript文档加载完成事件页面加载完成有两种事件一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二.是onloa ...
- Linux C 程序 线程(18)
线程控制 1.线程与进程的关系 线程:计算机中独立运行的最小单位. 在用户角度:多个线程是同时执行的. 操作系统角度:各个线程交替执行 以上只针对单核CPU的情况 在多核CPU主机上,多个线程可以同时 ...
- 常用JS加密编码算法
//#region UTF8编码函数 function URLEncode(Str) { if (Str == null || Str == "") return "&q ...
- Shell脚本升级CentOS php版本v
#! /bin/sh #1.关闭selinuxcp -rp /etc/selinux/config /etc/selinux/config.baksetenforce 0sed -i '7s/enfo ...
- keditor_php图片上传
<script type="text/javascript" src="/statics/js/kindeditor/kindeditor-min.js" ...
- js Table冻结表头示例代码
Table冻结表头的js实现代码. Table冻结表头: <script type="text/javascript"> //冻结table的表头 function ...
- openerp经典收藏 对象的预定义方法(转载)
对象的预定义方法 原文:http://shine-it.net/index.php/topic,2159.15.html 每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中 ...
- 《零成本实现Web自动化测试--基于Selenium》第一章 自动化测试基础
第一篇 Selenium 和WebDriver工具篇 第一章 自动化测试基础 1.1 初识自动化测试 自动化测试有两种常见方式 1.1.1 代码驱动测试,又叫测试驱动开发(TDD) 1.1.2 ...