資料結構與演算法——棧(三)有關棧的三種表示式 —— 字首、中綴、字尾表示式
三種表示式 —— 字首、中綴、字尾表示式
字首表示式(波蘭表示式)
字首表示式又稱為 波蘭表示式,字首表示式的 運算子位於運算元之前。
例如:( 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 是表示式的值,由此得出最終結果