棧 表示式的轉換規則及其求值方法

2021-08-28 16:51:49 字數 1015 閱讀 2087

總結一下利用棧實現字首、中綴、字尾表示式之間的轉換規則。

先畫個棧存放操作符,再從左到右掃瞄中綴表示式,如果遇到運算元,直接把它從左往右寫出來,如果遇到操作符,就把它入棧,但在入棧前先做一樣工作,就是把它和棧頂運算子做比較,如果它的優先順序小於或等於棧頂運算子,則棧頂運算子出棧,並寫到當前結果的運算表示式的右邊。若大於,則入棧。若棧空,直接入棧。遇到括號的情況,若遇到左括號,直接入棧。當棧頂元素是左括號的時候,所有掃瞄到的運算子都入棧。當掃瞄到右括號的時候,則執行一系列的出棧操作,把棧中所有的在左括號之前的元素全部出棧並加入表示式中,括號直接扔掉。當掃瞄完所有字元時,若棧中還有運算子,則全部出棧並加入表示式中。

和中綴轉字尾的過程相似,但有所不同的是,從右往左掃瞄,遇到右括號則右括號入棧,遇到左括號時則把棧中左括號之前的運算子全部出棧。表示式寫的時候是從右往左寫出來。當掃瞄到的運算子優先順序小於棧頂運算子時,棧頂運算子出棧,當前運算子入棧。

這個的轉化跟前面兩個不一樣,還有,無論是字尾表示式還是字首表示式中都沒含有括號,所以不需要處理括號。做法是從左到右掃瞄,當遇到運算數時,將該運算數入棧,當遇到運算子時,對棧做兩次彈出操作,然後依次寫出「操作符  第二彈出元素  棧頂元素」,然後將這個整體式子壓入棧中,再次重複操作。

要設定兩個棧,乙個存運算元,乙個存運算子,從左向右掃瞄,當掃瞄到運算元時,將運算元壓入棧,當掃瞄到運算子時,先比較棧頂運算子和當前運算子的優先順序,若棧頂運算子優先順序小於當前運算子,則將運算子入棧,否則將棧頂運算子彈出,並彈出運算元棧的兩個元素,進行運算後重新壓入運算元棧。當遇到左括號時,將其壓入棧,直到遇到右括號時,陸續將棧中在左括號之前的所有運算子出棧運算。

只需要設定乙個棧,從左往右掃瞄,當遇到運算元時,將其壓入棧中,當遇到運算子時,彈出棧中兩個元素,進行運算,並將運算結果重新壓入棧中,重複這些操作過程即可!

字首表示式的求值與字尾表示式的求值類似,不過字首表示式是從右往左開始掃瞄。

表示式求值(棧)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...

棧 表示式求值

核心演算法思想 1.運用兩個棧,乙個存運算子,乙個存數值 2.以 做為標誌位,開頭或者結尾 3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,1 若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧 2 若當前運算子優先順序等於棧頂優先順序 括號的情況 則...

棧 表示式求值

把運算的處理專門放在乙個函式裡,然後通過優先順序的判斷去呼叫函式,注意那個 還是放在else if裡面吧,不要和運算混在一起了 includeusing namespace std const int n 1e5 10 stacks1 stacks2 int flag 0 處理 四個 mapcmp ...