测试数据:
input
F &!F | !V|!V & !F& !( F | F& (V | !F| !V| V& (V|F)))
F& !F|!V|!F& (V|F| !V) & !F&!(F|F& (V | !F|!V| V &(V| F) ))
F&!F | !V| !F& !!!( V|F| !V) & !F&!(F|F& (V|!F|!V|V&(V|F)))
!V|!F&! (V|(F | V )| !V)& !F& !!(F| F& (V|!F|!V|V&( V| F )))
(F|(F&V)|!V)&!F&! (F|(F&( V| !F|!V |V& (V |F)) ))
V
(((V)))
((!(F)))
(!(!( !(F ))))
!!F|!F&!(V|(F|V)|!V)&!F&!!(F|F&(V|!F|!V|V&(V|F)))|((!(F)))
output
Expression 1: F
Expression 2: V
Expression 3: F
Expression 4: F
Expression 5: F
Expression 6: V
Expression 7: V
Expression 8: V
Expression 9: V
Expression 10: V
/*
每往栈中压入一个元素,就要判断他前面是否有!,因为单目运算符的运算级别最高。
也可能有连续的!
括号前也可能有!
所以一个括号表达式算完后也要判断!
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include<string.h>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
char s[1025];
int casei=1;
while(gets(s))
{
// printf("123\n");
stack<int> val;
stack<char> op;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]==' ')
continue;
else if(s[i]=='(')
op.push(s[i]);
else if(s[i]=='F'||s[i]=='V')
{
int t=(s[i]=='F'?0:1);
while(!op.empty()&&op.top()=='!')
{
t=!t;
op.pop();
}
val.push(t);
}
else if(s[i]=='|')
{
if(!op.empty()&&(op.top()=='&'||op.top()=='|'))
{
int a=val.top();
val.pop();
int b=val.top();
val.pop();
if(op.top()=='&')
val.push(a&b);
else
val.push(a|b);
op.pop();
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
op.push(s[i]);
}
else if(s[i]=='&')
{
if(!op.empty()&&(op.top()=='&'))
{
int a=val.top();
val.pop();
int b=val.top();
val.pop();
val.push(a&b);
op.pop();
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
op.push(s[i]);
}
else if(s[i]==')')
{
while(!op.empty()&&op.top()!='(')
{
if(op.top()=='&'||op.top()=='|')
{
int a=val.top();
val.pop();
int b=val.top();
val.pop();
if(op.top()=='&')
val.push(a&b);
else
val.push(a|b);
op.pop();
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
else if(op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
op.pop();
while(!op.empty()&&op.top()=='!') //括号前面还可能有!
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
else if(s[i]=='!')
op.push(s[i]);
}
while(!op.empty())
{
if(op.top()=='&'||op.top()=='|')
{
int a=val.top();
val.pop();
int b=val.top();
val.pop();
if(op.top()=='&')
val.push(a&b);
else
val.push(a|b);
op.pop();
while(!op.empty()&&op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
else if(op.top()=='!')
{
int a=val.top();
val.pop();
val.push(!a);
op.pop();
}
}
printf("Expression %d: %c\n",casei++,val.top()==1?'V':'F');
}
return 0;
}