题意:关于!,&,| 的运算,表达式中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 (布尔表达式求值)相关推荐

  1. (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)

    /** POJ_2106.cpp** Created on: 2013年10月30日* Author: Administrator*/#include <iostream> #includ ...

  2. 天池 在线编程 布尔表达式求值(栈)

    文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588 给定一个字符串代表 ...

  3. POJ 2106-Boolean Expressions,双栈运用类似表达式求值!

    Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...

  4. 表达式求值Spring.Expressions

    简介 Spring.Expressions命名空间可以用一种强大的表达式语言在运行时操作对象.这种语言可以读写属性值.调用方法.访问数组/集合/索引器的元素.进行算术和逻辑运算,同时支持命名变量,并且 ...

  5. AVIATOR——轻量级JAVA表达式求值引擎

    简介 Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator ...

  6. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)

    题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...

  7. 算符优先文法,中缀式求值,栈的典型应用

    栈,是比较基础,应用比较广的一种数据结构,栈和队列都可以看成是比较特殊的一些链表,其最突出的特性就是先进后出.虾米阿尼是一个比较常见的中缀表达式求值的应用,当然中缀式到后缀式的转化也是可以实现的. 中 ...

  8. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...

    本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...

  9. leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

    题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...

最新文章

  1. 五条强化 SSH 安全的建议
  2. 关于 Node.js 应用里使用 winston 进行日志记录的最佳实践
  3. (3)stm32开发之串口的调试
  4. JavaScript 框架之战结束:React 是最终赢家?
  5. java Web常用过滤器
  6. 【Unity3D入门教程】Unity3D简介、安装和程序发布
  7. java随机生成随机整数_java生成随机整数
  8. 基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标
  9. 达人评测 骁龙778g和骁龙780g的区别 选哪个好
  10. 如何在计算机上增加一个磁盘分区,win10系统额外新增加一个硬盘分区的详细办法...
  11. 如何计算股票程序化交易系统的收益率?
  12. 正则表达式收藏(三)之高级技巧
  13. CPython是什么?PyPy是什么?Python和这两个东西有什么关系
  14. Android自定义控件-仿淘宝ios客户端天猫商品详情界面
  15. idea突然很卡解决办法
  16. 【渝粤题库】广东开放大学 文化投资与贸易 形成性考核 (2)
  17. python小练习--GUI基础
  18. 后端程序员如何写出优雅的前端试图【Thymeleaf】
  19. 股指期货风险管理实证研究——以2015年股灾为例实证分析/VaR/EViews
  20. 退化过程及模型的简单介绍

热门文章

  1. OCJP试题分析第一章
  2. 【HTTP趣谈】origin,referer和host的区别
  3. 学习《apache源代码全景分析》之多任务并发处理摘录
  4. hadoop安装部署(伪分布及集群)
  5. Scala入门到精通——第六节:类和对象(一)
  6. 网络 IO 演变过程
  7. Redis高可用原理
  8. TensorFlow搭建简易Wide and Deep 模型
  9. Spark内存管理(3)—— 统一内存管理设计理念
  10. 面试心得与总结——BAT、网易、蘑菇街