逆波蘭表達式
-
a - b * c + d
:中綴表達式 (Infix Notation),原因是運算符號在兩個運算對象的中間。 -
+ - a * b c d
:前綴表達式 (Prefix Notation),又叫波蘭表達式,運算符在運算對象前面,又稱為波蘭表達式。 -
a b c * - d +
:后綴表達式 (Suffix Notation),又叫逆波蘭表達式,運算符在運算對象后面,又稱為逆波蘭表達式。
后綴表達式的優點
- 相較于前綴表達式更易于轉換,最左邊一定為數字。
- 不用括號,依靠運算順序確定運算符的優先級。
- 更符合計算機的計算方式。計算機通過從左至右讀取后綴表達式,就可以將遇到的運算對象壓入棧,在遇到運算符時就彈出兩個運算對象,完成計算,再將結果壓入棧。最后留在棧中的就是計算結果。
中綴表達式轉換為后綴表達式的方法
a + b * c - (d + e)
1.按照運算符的優先級對所有的運算單位加括號。
((a + (b * c)) - (d + e))
2.轉換中綴與后綴表達式后綴:把運算符號移動到對應的括號后面。
((a (b c) * ) + (d e) + ) -
3.把括號去掉,即得到了后綴表達式
a b c * + d e + -
可以發現,后綴表達式是不需要括號來調整運算優先級的。
中綴表達式轉換為后綴表達式的算法
1) 如果遇到操作數,則直接輸出。
2) 如果遇到操作符,則檢查棧頂元素優先級,如果其優先級不低于當前操作符(左括號除外),則彈出棧頂元素并輸出。重復此過程直到棧頂元素優先級小于當前操作符或為左括號,或者棧為空。 然后將當前操作符壓入棧中。
3)如果遇到左括號,直接壓入棧中。
4) 如果遇到右括號,則將棧中元素彈出,直到遇到左括號為止。左括號只彈出棧而不輸出。
5) 表達式處理完畢,則將棧中元素依次彈出。
注意只有遇到右括號的情況下才會彈出左括號,其他情況都不會彈出。
中綴表達式轉換為前綴表達式的方法
與轉換為后綴表達式的方法類似,只是把運算符移動到對應括號的前面。
a + b * c - (d + e)
1.按照運算符的優先級對所有的運算單位加括號。
((a + (b * c)) - (d + e))
2.轉換中綴與后綴表達式后綴:把運算符號移動到對應的括號前面。
- ( + (a * (b c)) + (d e))
3.把括號去掉,即得到了前綴表達式
- + a * b c + d e
結束語
本文代碼以及更多更新在github上。