POJ 2106 Boolean Expression 表達式求值
阿新 • • 發佈:2017-06-09
ret get 題意 col pair 下一個 pop spa def
題意:給出布爾表達式求值?
插入數字時,若有!則更新.遇到右括號彈出知道左括號,左括號前有‘!‘則更新,
其余和中綴表達式一樣,遇到下一個運算符時 若操作棧中運算符優先級大,則先算.
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <stack> #include <map> using namespacestd; 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 表達式求值