布尔表达式

布尔表达式

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

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

输入
输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000
输出
对每行输入,如果表达式为真,输出"V",否则出来"F"
样例输入
( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))
样例输出   与表达式求值类似,只要注意!特殊判断即可
F
V
V
  • #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<iomanip>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<set>
    #include<map>
    using namespace std;
    char s[1005];
    stack<bool>B;
    stack<char>C;
    int main()
    { 
    	while(cin.getline(s,1000,'\n'))
    	{
    		int len=strlen(s);
    		while(!B.empty())B.pop();
    		while(!C.empty())C.pop();
    		for(int i=0;i<len;++i)
    		{
    			if(s[i]==' ')continue;
    			if(s[i]=='V')
    			{
    				bool tmp=true;
    				while(!C.empty()&&C.top()=='!') 
    				{
    					C.pop();
    					tmp=!tmp;
    				}
    				B.push(tmp);
    			}
    			else if(s[i]=='F')
    			{
    				bool tmp=false;
    				while(!C.empty()&&C.top()=='!')
    				{
    					C.pop();
    					tmp=!tmp;
    				}
    				B.push(tmp);
    			}
    			else if(s[i]=='('||s[i]=='!')
    			{
    				C.push(s[i]);
    			}
    			else if(s[i]==')')
    			{
    				while(C.top()!='(')
    				{
    					char op=C.top();
    					C.pop();
    					bool tmp1=B.top();B.pop();
    					bool tmp2=B.top();B.pop();
    					if(op=='&')B.push(tmp2&&tmp1);
    					else if(op=='|') B.push(tmp2||tmp1);
    				}
    				C.pop();
    				while(!C.empty()&&C.top()=='!')
    				{
    					bool tmp=B.top();B.pop();
    					B.push(!tmp);
    					C.pop();
    				}
    			}
    			else if(s[i]=='&')
    			{
    				while(!C.empty()&&C.top()=='&')
    				{
    					C.pop();
    					bool tmp1=B.top();B.pop();
    					bool tmp2=B.top();B.pop();
    					B.push(tmp1&&tmp2);
    				}
    				C.push(s[i]);
    			}
    			else if(s[i]=='|')
    			{
    				while(!C.empty()&&(C.top()=='|'||C.top()=='&'))
    				{
    					bool tmp1=B.top();B.pop();
    					bool tmp2=B.top();B.pop();
    					char op=C.top();C.pop();
    					if(op=='&')B.push(tmp1&&tmp2);
    					else if(op=='|')B.push(tmp1||tmp2);
    				}
    				C.push(s[i]);
    			}
    		}
    		while(!C.empty()) 
    		{
    			bool tmp1=B.top();B.pop();
    			bool tmp2=B.top();B.pop();
    			char op=C.top();C.pop();
    			if(op=='&')B.push(tmp1&&tmp2);
    			else if(op=='|')B.push(tmp1||tmp2);
    		}
    		if(B.top())cout<<"V"<<endl;
    		else cout<<"F"<<endl;
    	}
    	return 0;
    }


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值