标签:empty res ring ons while == ack ios blog
题意:给出布尔表达式求值?
插入数字时,若有!则更新.遇到右括号弹出知道左括号,左括号前有‘!‘则更新,
其余和中缀表达式一样,遇到下一个运算符时 若操作栈中运算符优先级大,则先算.
#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 表达式求值
标签:empty res ring ons while == ack ios blog
原文地址:http://www.cnblogs.com/HIKARI1149/p/6970768.html