首页 > 代码库 > POJ 2106 Boolean Expression 表达式求值

POJ 2106 Boolean Expression 表达式求值

题意:给出布尔表达式求值?
插入数字时,若有!则更新.遇到右括号弹出知道左括号,左括号前有‘!‘则更新,

其余和中缀表达式一样,遇到下一个运算符时 若操作栈中运算符优先级大,则先算.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const int N=3e4+20;
const double eps=1e-6;
//题意:给出布尔表达式求值? 
//插入数字时,若有!则更新.其余和中缀转后缀类似 
char s[N];
stack<int> val;
stack<char> op;
map<char,int> mp;//优先级 
void insert(int x)
{
    while(!op.empty()&&op.top()==!)//前面有‘!‘时 
    {
        op.pop();
        x=!x;
    }
    val.push(x);
}
int main()
{
    int cas=0; 
    mp[!]=3,mp[&]=2,mp[|]=1;
    while(gets(s))
    {
        while(!val.empty())
            val.pop();
        while(!op.empty())
            op.pop();
        int a,b;
        for(int i=0;s[i];i++)
        {
            if(s[i]== )    
                continue;
            if(s[i]==V)
                insert(1);
            else if(s[i]==F)
                insert(0);
            else if(s[i]==()
                op.push(();
            else if(s[i]==))//s[i]==‘)‘将括号内的值算出来 
            {
                while(op.top()!=()
                {
                    a=val.top(),val.pop();
                    b=val.top(),val.pop();
                    if(op.top()==|)
                        val.push(a|b);
                    else
                        val.push(a&b);
                    op.pop();    
                }
                op.pop();//‘(‘ 
                //!(..)
                while(!op.empty()&&op.top()==!)
                {
                    op.pop();
                    a=val.top(),val.pop();
                    val.push(!a);    
                }
            }    
            else 
            { 
                //遇到下一个运算符时 栈中优先级若大,则先算 
                while(!op.empty() && op.top()!=( && op.top()!=! && mp[op.top()]>=mp[s[i]]) 
                {
                    a=val.top(),val.pop();
                    b=val.top(),val.pop();
                    if(op.top()==|)
                        val.push(a|b);
                    else
                        val.push(a&b);
                    op.pop();
                }
                op.push(s[i]);
            }            
        }
        while(!op.empty())
        {
            a=val.top(),val.pop();
            b=val.top(),val.pop();
            if(op.top()==|)
                val.push(a|b);
            else
                val.push(a&b);
            op.pop(); 
        }    
        printf("Expression %d: ",++cas);
        if(val.top())
            printf("V\n");
        else
            printf("F\n");
        //getchar();
    }
//!V | V & V & !F & (F | V ) & (!F | F | !V & V)

    return 0;
}

 

POJ 2106 Boolean Expression 表达式求值