中綴表示式和逆波蘭式的相互轉換

2021-06-26 20:41:35 字數 1370 閱讀 4188

例子:

.in

8-(3+2*6)/5+4

.out

8 3 2 6 * + 5 / - 4 +

中綴表示式轉換為逆波蘭式:

將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:

其中stack op;用來存放運算子棧。陣列ans用來存放字尾表示式。

演算法思想:

從左到右掃瞄中綴表示式,是運算元就放進陣列ans的末尾。

1)如果是『(』直接壓入op棧。

2)如果是『)』,依次從op棧彈出運算子加到陣列ans的末尾,知道遇到'(';

3) 如果是非括號,比較掃瞄到的運算子,和op棧頂的運算子。

(1)如果掃瞄到的運算子優先順序高於棧頂運算子則把運算子壓入棧。

(2)否則的話(

若該運算子優先順序

小於或等於

此運算子棧頂的運算子

),就依次把棧中運算子彈出加到陣列ans的末尾,直到遇到優先順序低於掃瞄

到的運算子或棧空,並且把掃瞄到的運算子壓入棧中。

就這樣依次掃瞄,知道結束為止。

如果掃瞄結束,棧中還有元素,則依次彈出加到陣列ans的末尾,就得到了字尾表示式。

運算子優先順序參考:

優先順序分為棧內優先順序isp(in stack priority)和棧外優先順序icp(in coming priority)。除了括號以外,其他運算子進棧後優先順序都公升1,這樣可以體現在中綴表示式中相同優先順序的操作符自左向右計算的要求,讓位於棧頂的操作符先退棧並輸出。各運算子及符號優先順序:

操作符#

^*,/,%

+,-(

)isp07

5318

icp064

281逆波蘭式達式轉換為中綴表:

下面以(a+b)*c為例子進行說明:

(a+b)*c的逆波蘭式為ab+c*,假設計算機把ab+c*按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab+c*的執行結果如下:

1)a入棧(0位置)

2)b入棧(1位置)

3)遇到運算子「+」,將a和b出棧,執行a+b的操作,得到結果d=a+b,再將d入棧(0位置)

4)c入棧(1位置)

5)遇到運算子「*」,將d和c出棧,執行d*c的操作,得到結果e,再將e入棧(0位置)

經過以上運算,計算機就可以得到(a+b)*c的運算結果e了。

逆波蘭式除了可以實現上述型別的運算,它還可以派生出許多新的演算法,資料結構,這就需要靈活運用了。逆波蘭式只是一種序列體現形式。

中綴表示式和逆波蘭式的相互轉換

至於中綴表示式和逆波蘭式是什麼就不多闡述了。中綴表示式和波蘭式的相互轉換思想是一樣的 int judge char data return res string getnibolan string str else if cur else else else if a cur cur z a cur...

中綴式轉換為逆波蘭表示式

搗騰了一天,總算有個雛形了,先發上來吧,已知的bug 1.直接輸入回車會溢位,2.表示式不完整會溢位,3.多餘的 會造成未知的結果,但是如果是在式子的最後是沒有問題的,4.中文的字元會報錯。目前已知的就這麼多了吧 下面上 include include include struct stack ty...

字首 波蘭式 中綴 字尾表示式 逆波蘭式

中綴表示式 中綴表示式就是常見的運算表示式,如 3 4 5 6 字尾表示式 字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後 比如 3 4 5 6 與字首表示式類似,只是順序是從左至右 從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它...