[WUSTOJ] 布尔表达式的计算(栈和队列的综合应用)

题目描述:

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(); 
        
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值