布尔表达式
-
总时间限制:
- 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; }