1. 程式人生 > >POJ 2106 Boolean Expression 表達式求值

POJ 2106 Boolean Expression 表達式求值

ret get 題意 col pair 下一個 pop spa def

題意:給出布爾表達式求值?
插入數字時,若有!則更新.遇到右括號彈出知道左括號,左括號前有‘!‘則更新,

其余和中綴表達式一樣,遇到下一個運算符時 若操作棧中運算符優先級大,則先算.

#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 表達式求值