题目:
描述
输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V )
V表示true,F表示false,&表示与,|表示或,!表示非。
上式的结果是F

输入
输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000
输出
对每行输入,如果表达式为真,输出"V",否则出来"F"

// ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
using namespace std;
char calculate(char x, char y, char oper) { // 计算 x oper y bool a = (x == 'V'), b = (y == 'V'), ans;if (oper == '|')ans = (a || b);else if (oper == '&')ans = (a&&b);return ans ? 'V' : 'F';
}
char reverse(char x) {if (x == 'V')return 'F';return 'V';
}
int main() {string in;int i, j, len;while (getline(cin, in)) {stack< char > Oper, num; //oper保存运算符,num保存运算结果 queue< char > s;    //  s就是前缀表达式 len = in.length();i = len;in = " " + in;while (i > 0) {  // 从右往左,中缀表达式转 前缀表达式 if (in[i] == ' ') {i--;continue;}else if (isalpha(in[i]))s.push(in[i--]);else if (in[i] == '!')      //最高级的运算,直接进入表达式 s.push(in[i--]);else {if (in[i] == '&' || in[i] == '|' || in[i] == ')')  //低级运算,进栈 Oper.push(in[i--]);else if (in[i] == '(') {  //一个括号结束,弹出中间的所有运算符 while (Oper.top() != ')') {s.push(Oper.top());Oper.pop();}Oper.pop();i--;}}}while (!Oper.empty())      //栈中剩下的运算符 s.push(Oper.top()), Oper.pop();while (!s.empty()) {      //计算前缀表达式 char ch = s.front();s.pop();if (isalpha(ch))num.push(ch);else Oper.push(ch);if (!num.empty() && !Oper.empty() && Oper.top() == '!') {  //单目运算符‘!’; char x = num.top();num.pop();Oper.pop();num.push(reverse(x));}else if (num.size() >= 2 && !Oper.empty()) {     //双目运算符 char oper = Oper.top(), x, y;Oper.pop();x = num.top();num.pop();y = num.top();num.pop();num.push(calculate(x, y, oper));}}cout << num.top() << endl;}
}

布尔表达式----栈相关推荐

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

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

  2. 【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)

    题目链接 题意 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True & ...

  3. 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译

    本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...

  4. 编译原理——语法制导翻译并产生中间代码(布尔表达式和控制语句)

    语法制导翻译并产生中间代码: 概述: 语法分析之后,编译的任务是由已识别成功的正确源程序生成一组规格一致,便于计算加工的指令形式. 中间代码的生成方法: 语法制导翻译,属性文法制导翻译 中间代码: 不 ...

  5. C++编写布尔表达式

    要求:已知某种类型的布尔表达式由"V"."F"."!"."&"和"|"组成,其中," ...

  6. [Rust学习:四] Vec和栈

    [Rust学习:四] Vec和栈 一.前言 二.阅读Vec源码尝试常用接口. 1. 创建Vec 2. 在尾部添加push\extend\append 3. 任意位置添加insert 4. 在尾部删除p ...

  7. 6263:布尔表达式

    描述 输入一个布尔表达式,请你输出它的真假值. 比如:( V | V ) & F & ( F | V ) V表示true,F表示false,&表示与,|表示或,!表示非. 上式 ...

  8. 1106. 解析布尔表达式

    题目: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True " ...

  9. 【1106. 解析布尔表达式】

    来源:力扣(LeetCode) 描述: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t", ...

最新文章

  1. HDU - 6749 Mosquito(二分+状态压缩+最大流)
  2. C++map容器遍历删除:cannot increment value-initialized map/set iterator
  3. 通过JS原型定义字符串格式化方法
  4. Linunx操作基础(十六)之Systemd 入门教程(一)
  5. 好好把握人生的12种财富
  6. Docker学习总结(22)——Docke run命令详解
  7. NMAP网络扫描工具的安装与使用
  8. Spring Cloud 和 Dubbo,到底用哪个好?
  9. JavaWeb项目分层结构
  10. 王思聪吃热狗 - 飞机大战小游戏
  11. 小米平板2刷Linux教程,小米平板2刷机教程 官方线刷图文教程
  12. kibana日志收集
  13. Oracle 的 Round函数详解
  14. Atcoder Beginner Contest (ABC) 237 A - E
  15. SSH-KeyGen -认证密钥的生成、管理和转换
  16. GAN中的Spectral Normalization
  17. 达梦数据库DEM(企业管理器)部署实战
  18. lstm 文本纠错_中文文本纠错算法--错别字纠正的二三事
  19. 充电枪cp信号控制板_一种电动汽车交流充电系统的CP信号电压检测方法及装置与流程...
  20. shell脚本-eval的用法

热门文章

  1. libp2p-rs kad使用及调试方法
  2. Ubuntu 16.04配置Wine并安装TIM
  3. 计算机专业考证难不难,成人自考本科计算机专业考试难不难
  4. 05-数据科学的基础:数据收集之市场调查_01 市场调查概括
  5. 集成电路设计专业有计算机课程吗,集成电路设计与集成系统专业介绍
  6. linux版drastic模拟器设置,NDS模拟器如何设置?怎样配置nds模拟器NO$GBA?
  7. Android 跳转到安卓市场进行下载,跳转至应用商店下载
  8. python 时间函数
  9. VC操作excel表格
  10. android开发BUG记录