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=105; 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=0;maps['!']=3;maps['&']=2;maps['|']=1;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=1;opNot(a);} else if(ch=='F') {a=0;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);elseval.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);elseval.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);elseval.push(a&b);}if(val.top()==1)ch='V';elsech='F';printf("Expression %d: %c\n",t,ch);}return 0; }
转载于:https://www.cnblogs.com/chenxiwenruo/p/3340620.html
POJ 2106 Boolean Expressions (布尔表达式求值)相关推荐
- (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)
/** POJ_2106.cpp** Created on: 2013年10月30日* Author: Administrator*/#include <iostream> #includ ...
- 天池 在线编程 布尔表达式求值(栈)
文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588 给定一个字符串代表 ...
- POJ 2106-Boolean Expressions,双栈运用类似表达式求值!
Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...
- 表达式求值Spring.Expressions
简介 Spring.Expressions命名空间可以用一种强大的表达式语言在运行时操作对象.这种语言可以读写属性值.调用方法.访问数组/集合/索引器的元素.进行算术和逻辑运算,同时支持命名变量,并且 ...
- AVIATOR——轻量级JAVA表达式求值引擎
简介 Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator ...
- 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)
题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...
- 算符优先文法,中缀式求值,栈的典型应用
栈,是比较基础,应用比较广的一种数据结构,栈和队列都可以看成是比较特殊的一些链表,其最突出的特性就是先进后出.虾米阿尼是一个比较常见的中缀表达式求值的应用,当然中缀式到后缀式的转化也是可以实现的. 中 ...
- 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...
- leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)
题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...
最新文章
- 五条强化 SSH 安全的建议
- 关于 Node.js 应用里使用 winston 进行日志记录的最佳实践
- (3)stm32开发之串口的调试
- JavaScript 框架之战结束:React 是最终赢家?
- java Web常用过滤器
- 【Unity3D入门教程】Unity3D简介、安装和程序发布
- java随机生成随机整数_java生成随机整数
- 基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标
- 达人评测 骁龙778g和骁龙780g的区别 选哪个好
- 如何在计算机上增加一个磁盘分区,win10系统额外新增加一个硬盘分区的详细办法...
- 如何计算股票程序化交易系统的收益率?
- 正则表达式收藏(三)之高级技巧
- CPython是什么?PyPy是什么?Python和这两个东西有什么关系
- Android自定义控件-仿淘宝ios客户端天猫商品详情界面
- idea突然很卡解决办法
- 【渝粤题库】广东开放大学 文化投资与贸易 形成性考核 (2)
- python小练习--GUI基础
- 后端程序员如何写出优雅的前端试图【Thymeleaf】
- 股指期货风险管理实证研究——以2015年股灾为例实证分析/VaR/EViews
- 退化过程及模型的简单介绍