POJ 2106 Boolean Expressions (布尔表达式求值)
生活随笔
收集整理的這篇文章主要介紹了
POJ 2106 Boolean Expressions (布尔表达式求值)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:關于!,&,| 的運算,表達式中V代表true,F代表false。
思路:見代碼吧,很詳細了。
要注意 !!!F,!(...) 的情況。
?
#include <iostream> #include <stdio.h> #include <stack> #include <string.h> #include <map>using namespace std; const int maxn=105; stack<int> val; //存儲操作數和中間運算結果 stack<char> op; //存儲運算符 map<char,int> maps; //存儲相應運算符的優先級,數值大代表優先級高//求!a void opNot(int a){while(!op.empty() && op.top()=='!') {op.pop();a=!a;}val.push(a); } int main() {char ch;int a,b,t=0;maps['!']=3;maps['&']=2;maps['|']=1;while((ch=getchar())!=EOF) {t++;while(!val.empty())val.pop();while(!op.empty())op.pop();do {if(ch==' ')continue;/*遇到V\F,查看之前的表達式中(即棧op中)是否存在優先級高的單目運算符!。若存在,將這些單目運算符出op棧,對操作數進行相應的運算,再將運算結果壓入val棧*/if(ch=='V') {a=1;opNot(a);} else if(ch=='F') {a=0;opNot(a);}//若遇到(,直接入op棧else if(ch=='(') {op.push('(');}/*當遇到'(',將op中的運算符出棧,并將val棧中退出兩個操作數,求值后將結果如val棧直至遇到'('結束。這里不需要考慮運算符為!的情況,因為之前肯定已經處理過了。這里還要注意的是,很有可能在'('前有!運算符,所以再求出(...)內的值后,不能就以為ok了。還要判斷op棧頂上是否存在'!',若存在,還要對結果取!。*/else if(ch==')') {//一開始忽略了有!(...)情況,導致一直WA。。。while(op.top()!='(') {a=val.top();val.pop();b=val.top();val.pop();if(op.top()=='|')val.push(a|b);elseval.push(a&b);op.pop();}op.pop(); //將'('出棧//若(...)前有!,則將括號算出來的結果取!while(!op.empty() && op.top()=='!'){op.pop();a=val.top();val.pop();val.push(!a);}} else {/*若ch為'!',則不執行while循環,直接入op棧。若ch是其它雙目運算符,則計算op棧頂中優先級比ch高的雙目運算符。每彈出其中一個,從val棧頂退出兩個操作數a,b,求結果后入val棧。進行完所有op棧頂中優先級比ch高的雙目運算符后,再將ch壓入op棧*/while(!op.empty() && op.top()!='(' && op.top()!='!' && maps[op.top()]>=maps[ch]) {a=val.top();val.pop();b=val.top();val.pop();if(op.top()=='|')val.push(a|b);elseval.push(a&b);op.pop();}op.push(ch); //一開始都忘記把ch入棧了。。。 }} while((ch=getchar())!='\n' && ch!=EOF);/*掃描完所有表達式后,若op棧中還有運算符,則繼續計算。本來此處還考慮了萬一有'!'運算符的情況,后來把這部分代碼刪了,提交后仍AC,想了想,確實如果有'!',也早就在之前就已經處理了。*/while(!op.empty()) {ch=op.top();op.pop();a=val.top();val.pop();b=val.top();val.pop();if(ch=='|')val.push(a|b);elseval.push(a&b);}if(val.top()==1)ch='V';elsech='F';printf("Expression %d: %c\n",t,ch);}return 0; }?
?
轉載于:https://www.cnblogs.com/chenxiwenruo/p/3340620.html
總結
以上是生活随笔為你收集整理的POJ 2106 Boolean Expressions (布尔表达式求值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery ajax - ajax()
- 下一篇: MD5 32位加密算法源码(测试通过)(