三種表達式 —— 前綴、中綴、后綴表達式
前綴表達式(波蘭表達式)
前綴表達式又稱為 波蘭表達式,前綴表達式的 運算符位於操作數之前。
例如:( 2 + 3 ) × 4 – 5
對應的前綴表達式為:- × + 2 3 4 5
注意:前面這個表達式是一個中綴表達式,對應的是后面的這個前綴表達式。它的符號出現的順序與中綴的順序不一致。
前綴表達式中的符號順序,就是他求值的規定了
前綴表達式求值過程
-
從 右到左 掃描表達式
-
遇到 數字 時,將數字壓入堆棧
-
遇到 運算符 時
1)彈出棧頂的兩個數(棧頂和次頂),用運算符對它們做相應的計算,並將結果入棧。
計算順序是:先 彈出來的 (運算符) 后 彈出來的
然后重復以上步驟,直到表達式的最左端,最后運算出的值則是表達式的值。
看完前綴表達式的計算邏輯,那么你要明白的是,從一個 中綴表達式 轉換為 前綴表達式 時,優先級順序是已經處理好的,因為在求值時,不進行優先級的判定
例如:(3+4)x5-6
對應的前綴表達式為:- x + 3 4 5 6
,前綴表達式求值步驟如下:
-
從右到左掃描,將 6、5、4、3 壓入棧
-
遇到
+
運算符時:將彈出 3 和 4(3 為棧頂元素,4 為次頂元素),計算出
3 + 4 = 7
,將結果壓入棧 -
遇到
x
運算符時將彈出 7 和 5,計算出
7 x 5 = 35
,將 35 壓入棧 -
遇到
-
運算符時將彈出 35 和 6,計算出
35 - 6 = 29
,壓入棧 -
掃描結束,棧中留下的唯一一個數字 29 則是表達式的值
中綴表達式
中綴表達式就是 常見的運算表達式,如 (3+4)x5-6
。
中綴表達式的求值是人類最熟悉的,但是對於計算機來說卻不好操作:
- 需要計算運算符的優先級
- 處理括號優先級
因此,在計算結果時,往往會將 中綴表達式 轉成其他表達式,一般轉成后綴表達式。
后綴表達式(逆波蘭表達式)
后綴表達式 又稱為 逆波蘭表達式,與前綴表達式類似,只是 運算符 位於 操作數之后。
比如:(3+4)x5-6
對應的后綴表達式 3 4 + 5 x 6 -
再比如:
中綴表達式 | 后綴表達式 |
---|---|
a + b |
a b + |
a + (b-c) |
a b c - |
a+(b-c)*d |
a b c - d * + |
a+d*(b-c) |
a d b c - * + |
a=1+3 |
a 1 3 + = |
后綴表達式求值過程
-
從 左到右 掃描表達式
-
遇到 數字 時,將數字壓入堆棧
-
遇到 運算符 時
彈出棧頂的兩個數(棧頂和次頂),用運算符對它們做相應的計算,並將結果入棧。
計算順序是:后 彈出來的 (運算符) 先 彈出來的
同樣的也不用考慮符號優先級的問題
然后重復以上步驟,直到表達式的最右端,最后運算得出的值即為表達式的結果。
比如:(3+4)x5-6
對應的后綴表達式 3 4 + 5 x 6 -
-
從左到右掃描,將 3、4 壓入堆棧
-
掃描到
+
運算符時將彈出 4 和 3,計算
3 + 4 = 7
,將 7 壓入棧 -
將 5 入棧
-
掃描到
x
運算符時將彈出 5 和 7 ,計算
7 x 5 = 35
,將 35 入棧 -
將 6 入棧
-
掃描到
-
運算符時將彈出 6 和 35,計算
35 - 6 = 29
,將 29 壓入棧 -
掃描表達式結束,29 是表達式的值,由此得出最終結果