题解 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;
}