题目描述:
1004: 布尔表达式的计算
Description
需要你帮着计算任意一个布尔表达式的值。
Input
输入包含多组测试数据。每组测试数据一行,包含一个布尔表达式,其中T表示TRUE,F表示FALSE。每个表达式不超过100个字符。
Output
对每个表达式,输出“Expression”,后面跟着序列号,然后是“:”,最后是表达式的值。一个表达式输出占一行。
Sample Input !T|T&T&!F&(F|T)&(!F|F|!T&T)
(T|T)&F&(F|T)
(F&F|T|!T&!F&!(F|F&T))
(!(!( !(F ))))
Sample Output
Expression 1:T
Expression 2:F
Expression 3:T
Expression 4:T
这个题其实和之前我发的一篇“算数表达式求值”的博文其实很相似。同样都含有括号,都需要将中缀表达式转换为后缀表达式来求值。
简单说说思路及本题的一些要点吧。
1.优先级处理
注意优先级是!>&>|,故定义优先级判断函数advance,然后优先级高的先入栈,保证后面入队是是在前面,以先运算优先级高的字符。
2.字符处理
先将‘T,F’的字符入队,然后根据优先级入队前面字符,然后入队前面TF运算所对应的运算符(这里运算符已经按照优先级来,保证先运算优先级高的)
3.括号处理
先将‘(’入栈,然后根据运算符优先级入队相映数值以及运算符。一旦遇到’)'则入队括号间所有的剩余运算符,确保括号内运算的优先级。
4.后缀表达式?
本题其实就是将中缀表达式转换为后缀表达式,形如:T|F->T F |,这个就是队列内字符顺序,首先出队T,F,然后判断连接这两个数值的运算符,然后对之进行运算。
AC代码如下
#include<bits/stdc++.h>
using namespace std;
int cases=0;
stack<char>p;queue<char>q;
char s[10000];
int advance(char ch);
void work();
void calcu();
int main(){
memset(s,0,sizeof s);
while(gets(s)){
cases++;
while(!q.empty())q.pop();
while(!p.empty())p.pop();
work();calcu();