布尔表达式----栈
题目:
描述
输入一个布尔表达式,请你输出它的真假值。
比如:( 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. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588 给定一个字符串代表 ...
- 【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)
题目链接 题意 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True & ...
- 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译
本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...
- 编译原理——语法制导翻译并产生中间代码(布尔表达式和控制语句)
语法制导翻译并产生中间代码: 概述: 语法分析之后,编译的任务是由已识别成功的正确源程序生成一组规格一致,便于计算加工的指令形式. 中间代码的生成方法: 语法制导翻译,属性文法制导翻译 中间代码: 不 ...
- C++编写布尔表达式
要求:已知某种类型的布尔表达式由"V"."F"."!"."&"和"|"组成,其中," ...
- [Rust学习:四] Vec和栈
[Rust学习:四] Vec和栈 一.前言 二.阅读Vec源码尝试常用接口. 1. 创建Vec 2. 在尾部添加push\extend\append 3. 任意位置添加insert 4. 在尾部删除p ...
- 6263:布尔表达式
描述 输入一个布尔表达式,请你输出它的真假值. 比如:( V | V ) & F & ( F | V ) V表示true,F表示false,&表示与,|表示或,!表示非. 上式 ...
- 1106. 解析布尔表达式
题目: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True " ...
- 【1106. 解析布尔表达式】
来源:力扣(LeetCode) 描述: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t", ...
最新文章
- HDU - 6749 Mosquito(二分+状态压缩+最大流)
- C++map容器遍历删除:cannot increment value-initialized map/set iterator
- 通过JS原型定义字符串格式化方法
- Linunx操作基础(十六)之Systemd 入门教程(一)
- 好好把握人生的12种财富
- Docker学习总结(22)——Docke run命令详解
- NMAP网络扫描工具的安装与使用
- Spring Cloud 和 Dubbo,到底用哪个好?
- JavaWeb项目分层结构
- 王思聪吃热狗 - 飞机大战小游戏
- 小米平板2刷Linux教程,小米平板2刷机教程 官方线刷图文教程
- kibana日志收集
- Oracle 的 Round函数详解
- Atcoder Beginner Contest (ABC) 237 A - E
- SSH-KeyGen -认证密钥的生成、管理和转换
- GAN中的Spectral Normalization
- 达梦数据库DEM(企业管理器)部署实战
- lstm 文本纠错_中文文本纠错算法--错别字纠正的二三事
- 充电枪cp信号控制板_一种电动汽车交流充电系统的CP信号电压检测方法及装置与流程...
- shell脚本-eval的用法