日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 2106 Boolean Expressions (布尔表达式求值)

發布時間:2024/1/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 (布尔表达式求值)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。