POJ 2106-Boolean Expressions,雙棧運用類似表達式求值!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Boolean Expressions

? ?首先聲明此題后臺可能極水(畢竟這種數據不好造!)。昨天寫了一天卻總是找不到bug,討論區各種數據都過了,甚至懷疑輸入有問題,但看到gets也可以過,難道是思路錯了?

? ? 題意:V表示ture,F表示false,然后有三種位運算符‘!’、‘&’、'|'。其中'!'的優先級最高,‘|’的優先級最低。即優先級關系:! > & > | 。給你一串包含這些運算符的表達式當然了還有括號,要你判斷最終結果是VorF。

? ? 先說說我的思路吧:符號棧和數值棧肯定是前提(數組模擬也無所謂)。由于‘!’和‘&’的運算等級較高,于是我們可以先把所有的‘!’和‘&’先進行運算,最后運算或(掃一遍無先后)。當然了,括號的優先級最最高,我們特判括號的情況。你可能要問‘!’和’&‘的優先級有大小,怎么判斷先后呢,我們發現’!‘一般是在一個數值前面,當存入一個數值的時候可以直接運算,’&‘在兩個數值之間,也是直接取數值棧頂的兩個元素直接運算再入棧。就是因為’!‘只能在一個數值前或者括號前(括號內最終也會化為一個數值),所以如果’!‘和’&‘都出現了肯定會將’!‘先運算完再’&‘運算,本來也符合題意優先級之分。但為什么會wa這么多遍呢,next....

? ? 現在來說說括號怎么判,我們如果是出現'('的話直接先入符號棧,然后數值和符號也是直接入相應的棧再判斷運算。但當’)‘出現意味著肯定有一個最近的’(‘與其配對,我們這時就要把括號里的先運算完對吧,但上述提到’!‘和’&‘都是一出現就直接運算了,所以這時的括號內只能是單個數值或很多’|‘,還是直接運算,到’(‘就截止了嘛。最后彈出’(‘。好像看起來沒毛病,又是WA。原因為何?next.....

? ? 最后看其他人提交的代碼結果發現他們根本沒有判優先級,三種符號出現都是從左往右掃,這樣也過?’!‘的情況肯定沒問題,但’&‘和’|‘總得有個先后,一學弟給出一幅圖畫出單個’&‘和單個’|‘的所有情況讓我猜想這樣依次運算是否和先后運算的結果一樣?草草的證明了一下貌似真的可以(急功近利),然后仿照這大家的思路做了做終于發現自己的問題出在哪了,原來在進行’!‘和’&‘運算的時候沒有判斷到’(‘應截止。還有在’(‘應當出棧的時候沒有判斷棧頂元素是否為’(‘。也是神奇,我的正確思路居然被這種樣例hackde。這時仍接受著依次運算和先后運算的結果一樣的觀點,回到宿舍學姐再討論群里提出這樣一組數據:1|0&0 即 V|F&F。這樣明顯打破上述觀點,然后用兩種代碼都試了試果然依次運算的結果是F,正解應該是V。不得不說自己沒有仔細證明為了A題草草下定結論,不過所幸自己的代碼是沒有問題的。可能大家讀題題意沒有明確,卻陰差陽錯,集訓隊的讀題能力貌似一直處于迷離狀態。。。。

? ? 重(ji)點(tang):研究性學習真的是讓人很興奮,充分鍛煉一個人的耐心與思維,在結論成果得出的那一刻仿佛即將升天般的快感,這種學習方式也值得我們利用,當前學習狀態不禁讓我想起了快餐文化這一概念,急功近利總不得有好的結果,沉心靜氣淡泊名利才能走的更遠。不惜花了這么大的篇幅來引出這段話,就算個人體驗了,不喜勿噴。

? ? 回到原題,下面給出三種代碼:

?思路1:WA。未正確判斷好括號關系。

const int N=1e6+10;
stack<char>q1;
stack<int>q2;
char s[150];
void ch(char c)
{if(c=='!'){int x1=q2.top();q2.pop();x1=!x1;q2.push(x1);}else if(c=='&'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop(); q2.push(x1&x2);}else if(c=='|'){int x1=q2.top();  q2.pop();int x2=q2.top();  q2.pop();q2.push(x1|x2);}q1.pop();
}
int main()
{int t=1;char c;while(1){c=getchar();if(c==' ') continue;if(c=='\n'||c==EOF){while(!q1.empty()){if(q1.top()!='(') ch(q1.top());else q1.pop();}printf("Expression %d: ",t++);if(q2.top()==1) puts("V");else puts("F");while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();if(c==EOF) break;else continue;}if(c==')'){while(!q1.empty()&&q1.top()!='(') ch(q1.top());q1.pop();//本意是刪去‘(’,但應該判斷是否為空且棧頂是否為‘(’}else{if(c!='V'&&c!='F') q1.push(c);else{if(c=='V') q2.push(1);else q2.push(0);while(!q1.empty())//應該判斷‘(’截止{if(q1.top()!='!'&&q1.top()!='&') break;//‘!’和'&'優先ch(q1.top());}}}}return 0;
}


? 代碼二:AC。

const int N=1e6+10;
stack<char>q1;
stack<int>q2;
char s[N];
void ch(char c)
{if(c=='!'){int x=q2.top();q2.pop();q2.push(!x);}else if(c=='&'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1&x2);}else if(c=='|'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1|x2);}q1.pop();
}
int main()
{int t=1;while(gets(s)){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();int len=strlen(s);for(int i=0; i<len; i++){if(s[i]==' ') continue;if(s[i]==')'){while(!q1.empty()&&q1.top()!='(')  ch(q1.top());if(!q1.empty()&&q1.top()=='(') q1.pop();//刪去左括號}else{if(s[i]!='F'&&s[i]!='V') q1.push(s[i]);else{if(s[i]=='F') q2.push(0);else q2.push(1);while(!q1.empty()&&q1.top()!='('){if(q1.top()!='&'&&q1.top()!='!') break;ch(q1.top());}if(!q1.empty()&&q1.top()=='(') q1.pop();}}}printf("Expression %d: ",t++);while(!q1.empty()) ch(q1.top());if(q2.top()==1) puts("V");else puts("F");}return 0;
}


? 代碼三:hacked ? V|F&F

const int N=1e3+10;
stack<char>q1;
stack<int>q2;
char s[N];
void deal(char tmp)
{if(tmp==')') q1.pop();else{if(tmp=='V') q2.push(1);else q2.push(0);}while(!q1.empty()&&q1.top()!='('){char c=q1.top();q1.pop();if(c=='!'&&!q2.empty()){int x=q2.top();q2.pop();q2.push(!x);}else if(c=='&'&&q2.size()>1){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1&x2);}else if(c=='|'&&q2.size()>1){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1|x2);}}
}
int main()
{int t=1;while(gets(s)){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();int len=strlen(s);for(int i=0; i<len; i++){if(s[i]==' ') continue;if(s[i]=='F'||s[i]=='V'||s[i]==')') deal(s[i]);else q1.push(s[i]);}printf("Expression %d: ",t++);if(!q1.empty()) deal(q1.top());if(q2.top()==1) puts("V");else puts("F");}return 0;
}


轉載于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208090.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456178.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H264 CAVLC 研究

目錄 1 CAVLC概念 2 CAVLC原理 3 CAVLC編碼流程 4 CAVLC解碼流程 展開全部 1 CAVLC概念 2 CAVLC原理 3 CAVLC編碼流程 4 CAVLC解碼流程 收起 摘要糾錯編輯摘要 CAVLC即基于上下文的自適應變長編碼。H.264標準中使用CAVLC對4*4模塊的亮度和色度殘差數據進行編碼。 CAVLC-CAVLC…

【MySQL 】學習筆記千行總結

/* Windows服務 */ -- 啟動MySQLnet start mysql -- 創建Windows服務sc create mysql binPath mysqld_bin_path(注意&#xff1a;等號與值之間有空格)/* 連接與斷開服務器 */ mysql -h 地址 -P 端口 -u 用戶名 -p 密碼SHOW PROCESSLIST -- 顯示哪些線程正在運行 SHOW VARIABLES…

CCCC 連續因子

題意&#xff1a; 一個正整數N的因子中可能存在若干連續的數字。例如630可以分解為3*5*6*7&#xff0c;其中5、6、7就是3個連續的數字。給定任一正整數N&#xff0c;要求編寫程序求出最長連續因子的個數&#xff0c;并輸出最小的連續因子序列。 輸入格式&#xff1a; 輸入在一行…

Mybatis怎么能看是否執行了sql語句

項目需要學習mybatis中&#xff0c;本來mybatis也不是什么新技術&#xff0c;無奈之前沒接觸過。 驗證緩存機制時&#xff0c;需要能看到是否sql被執行了。這就需要增加日志的打印 配置如下 在pom中增加如下依賴&#xff1a; <dependency> <groupId>org.bgee.log4j…

定時備份 MySQL 并上傳到七牛

定時備份 MySQL 并上傳到七牛 多數應用場景下&#xff0c;我們需要對重要數據進行備份、并放置到一個安全的地方&#xff0c;以備不時之需。 常見的 MySQL 數據備份方式有&#xff0c;直接打包復制對應的數據庫或表文件(物理備份)、mysqldump 全量邏輯備份、xtrabackup 增量邏輯…

vue_props div賦值props定義變量 templete獲取

vue_props div賦值props定義變量 templete獲取 <div id"app"> <add v-bind:btn"h"></add> </div> <script> var vm new Vue({ el: #app, data: { h: "hello" }, components: { "add": { …

H.264句法和語法總結 句法元素的分層結構

在 H.264 定義的碼流中&#xff0c;句法元素被組織成有層次的結構&#xff0c;分別描述各個層次的信息&#xff0c;如下圖所示 在H.264 中&#xff0c;句法元素共被組織成 序列、圖像、片、宏塊、子宏塊五個層次。 在這樣的結構中&#xff0c;每一層的頭部和它的數據部分形成管…

instanceof 的運用

2019獨角獸企業重金招聘Python工程師標準>>> Java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出&#xff0c;這個對象是否是這個特定類或者是它的子類的一個實例。 用法&#xff1a; result object i…

R 腳本讀取匯總 Excel 表格數據

主要用到了 xlsx 和 rJava 包&#xff0c;打開 Excel 文件&#xff0c;讀取各表格數據&#xff0c;再寫入到匯總表。 下圖為處理前的原始數據表格&#xff1a; 下圖為處理后的數據&#xff1a; 代碼實現 安裝&加載包的函數實現。installed.packages() 函數獲取所有已安裝…

[Grid Layout] Place grid items on a grid using grid-column and grid-row

It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid-template-columns and grid-template-rows, and to the grid items, we’ll pass grid-column and grid-row some numeric values. <!DOCTYPE html> <html l…

【大數據】最新大數據學習路線(完整詳細版,含整套教程)

大數據學習路線 java(Java se,javaweb) Linux(shell,高并發架構,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 機器學習(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

264編碼基本概念 FFMpeg的解碼流程

下面轉自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8樓 1、NAL、Slice與frame意思及相互關系 NAL指網絡提取層&#xff0c;里面放一些與網絡相關的信息Slice是片的意思&#xff0c;264中把圖像分成一幀&#xff08;frame&#xff09;…

谷歌瀏覽器開發調試工具中Sources面板 js調試等 完全介紹

這次分享的是Chrome開發工具中最有用的面板Sources。 Sources面板幾乎是我最常用到的Chrome功能面板&#xff0c;也是在我看來決解一般問題的主要功能面板。通常只要是開發遇到了js報錯或者其他代碼問題&#xff0c;在審視一遍自己的代碼而一無所獲之后&#xff0c;我首先就會打…

java XML解析防止外部實體注入

/** * 增加防止部實體注入邏輯* <功能詳細描述>* param reader* throws SAXException* see [類、類#方法、類#成員]*/public static void setReaderFeature(SAXReader reader)throws SAXException{reader.setFeature("http://apache.org/xml/features/disallow-doct…

【Python】最新Python學習路線(完整詳細版,含整套教程)

python目前應用最廣的三個崗位&#xff1a;全棧開發、數據分析、運維開發&#xff0c;今天我們就以這三個重點的崗位來做一下自學Python的規劃&#xff0c;希望你在學之前就能有明確的學習方向。 最近開始整理python的資料&#xff0c;博主建立了一個qq群&#xff0c;希望給大家…

程序員,軟件測試知多少?

送給初級程序員的測試認知文作為開發同學&#xff0c;一些基本的測試崗位相關知識還是很有必要了解一下&#xff0c;免的某些同學在工作中和測試同學斗嘴、打架、群毆等以及被測試鄙視....。 我們常常聽說的一些測試專業術語&#xff0c;比如白盒、黑盒、單元測試&#xff0c;相…

ffmpeg最新源代碼(定期更新)

為了方便那些不能連接到ffmpeg的SVN倉庫更新源代碼的用戶&#xff0c;ffmpeg工程組特開辟一個專區&#xff0c;定期更新ffmpeg的源代碼&#xff0c;并將其快照上傳&#xff0c;有需要的朋友可以長期關注本帖。ffmpeg的編譯指令通常為&#xff1a;1、配置&#xff1a;configurat…

vue 入門環境搭建

公司項目要用vue.js來開發&#xff0c;要使用vue來開發前端框架&#xff0c;首先要有環境&#xff0c;所以給大家介紹一下如何搭建vue環境。其實很簡單&#xff1a; 1.首先下載安裝node.js。 去官網https://nodejs.org/zh-cn/下載安裝包。 2.安裝webpack 打開cmd命令界面&#…

【解決】Win10修改host沒有權限問題

Step1&#xff1a;右鍵文件選擇屬性&#xff0c;選擇安全&#xff0c;點擊編輯&#xff1a; Step2&#xff1a;在彈窗中點擊添加&#xff0c;在彈窗中點擊高級&#xff1a; Step3&#xff1a;在彈窗中點擊立即查找&#xff0c;選中當前用戶&#xff0c;點擊確定&#xff1a; …

[已授權] 互聯網定位技術小談

? 誠邀阿里云先知社區邀請&#xff0c;不勝感激&#xff01;今日小編在此為大家介紹一下互聯網中所應用的定位技術。互聯網的發展日新月異&#xff0c;技術迭代很快&#xff0c;各行各業的智慧在互聯網這片藍天下碰撞結晶&#xff0c;造福大眾。今天要講述的集中定位方式&…