题解 P1575 【正误问题】
下面用栈模板stack来做。
#include<bits/stdc++.h>
using namespace std;
stack<int>s;//运算优先级栈
stack<bool>f;//布尔栈
void cal()
{
bool f1,f2;
switch(s.top())
{
case 1:if(f.size()<2) //没有2个元素参与运算判错
{cout<<"error";exit(0);}
f1=f.top();f.pop();
f2=f.top();f.pop();//取出栈顶2个元素
f.push(f1||f2);break;//or运算后回栈
case 2:if(f.size()<2) //元素不够即判错
{cout<<"error";exit(0);}
f1=f.top();f.pop();
f2=f.top();f.pop();//取出栈顶2个元素
f.push(f1&&f2);break;//and运算后回栈
case 3:if(f.empty())
{cout<<"error";exit(0);}
f1=f.top();f.pop();//取出栈顶1个元素
f.push(!f1);break; //取取反运算后回栈
}
s.pop();
}
int main()
{
string st;
while(cin>>st)
{
if(st=="or")
{
while(!s.empty())//运算符栈中不空
cal();
s.push(1);//优先级1
}
else if(st=="and")
{
while(!s.empty()&&s.top()>=2)//运算符栈中不空且优先级为2以上
cal();
s.push(2);
}
else if(st=="not")//最优先级的not直接压栈
s.push(3);
else if(st=="true")//布尔值入布尔栈
f.push(1);
else if(st=="false")//布尔值入布尔栈
f.push(0);
}
while(!s.empty())
cal();//最后的运算
if(f.size()==1)
{
if(f.top()==1) cout<<"true";
else cout<<"false";
}
else cout<<"error";
return 0;
}