中綴表達式就是我們正常工作中寫的表達式,如 a+(b-c)*d
,編譯系統將中綴表達式改寫 abc-d*+
,這種運算符在操作數後面稱爲後綴表達式(也稱逆波蘭表達式)。
後綴表達式最方便的作用就是在計算的時候直接操作棧出棧就可以了。
轉換過程需要用到棧,這裏用兩個棧,stack 棧用來存放運算符,post 棧用來存放最後的後綴表達式。具體規則如下:
運算符一共三種情況,操作數,符號,括號
開始:
(1)該運算符若是操作數,直接存入 post 棧。
(2)該運算符是左括號 (
, 則直接存入 stack 棧。
(3)該運算符是右括號 )
,則將 stack 棧中 (
右的所有運算符出棧,存入 post 棧。
(4)若該運算符爲符號(加減乘除等),則將該符號(稱爲X)和 stack 棧頂符號作比較:若X優先級高於棧頂符號,則直接存入 stack 棧;若X優先級低於或等於棧頂符號則將棧頂符號出棧存入post,然後繼續對比棧頂符號,直到stack棧爲空或者遇到比X運算等級低的符號停止。然後將X入stack棧。
(5)當掃描完後,stack 棧中還有運算符時,則將所有運算符出棧,存入 post 棧。
例子:中綴表達式 a + b * c + (d * e + f) * g
,其轉換成後綴表達式則爲a b c * + d e * f + g * +
。
掃描 | stack 棧 | post 棧 |
---|---|---|
a | 空 | a |
a+ | + | a |
a+b | + | ab |
a+b* | +* | ab |
a+b*c | +* | abc |
a+b*c+ | + | abc*+ |
a+b*c+( | +( | abc*+ |
a+b*c+(d | +( | abc*+d |
a+b*c+(d* | +(* | abc*+d |
a+b*c+(d*e | +(* | abc*+de |
a+b*c+(d*e+ | +(+ | abc*+de* |
a+b*c+(d*e+f | +(+ | abc*+de*f |
a+b*c+(d*e+f) | + | abc*+de*f+ |
a+b*c+(d*e+f)* | +* | abc*+de*f+ |
a+b*c+(d*e+f)*g | +* | abc*+de*f+g |
a+b*c+(d*e+f)*g# | 空 | abc*+de*f+g*+ |
注意:表格中第6步,讀到
+
,因爲棧頂符號*
的優先級高,所以*
出棧,棧中下一個元素+
優先級與讀到的操作符+
一樣,所以也要彈出。然後再將讀到的+
壓入棧中。
第13步,讀到)
,則直接將棧中元素彈出直到遇到(
爲止。這裏左括號前只有一個操作符+
被彈出。
轉自:https://www.jianshu.com/p/fcd2b521a3e2
略爲修改 csdn現在投轉載太麻煩了,所以投原創了