1. 程式人生 > 其它 >資料結構與演算法——棧(三)有關棧的三種表示式 —— 字首、中綴、字尾表示式

資料結構與演算法——棧(三)有關棧的三種表示式 —— 字首、中綴、字尾表示式

三種表示式 —— 字首、中綴、字尾表示式

字首表示式(波蘭表示式)

字首表示式又稱為 波蘭表示式,字首表示式的 運算子位於運算元之前

例如:( 2 + 3 ) × 4 – 5 對應的字首表示式為:- × + 2 3 4 5

注意:前面這個表示式是一箇中綴表示式,對應的是後面的這個字首表示式。它的符號出現的順序與中綴的順序不一致。

字首表示式中的符號順序,就是他求值的規定了

字首表示式求值過程

  1. 右到左 掃描表示式

  2. 遇到 數字 時,將數字壓入堆疊

  3. 遇到 運算子

    1)彈出棧頂的兩個數(棧頂和次頂),用運算子對它們做相應的計算,並將結果入棧。

    ​ 計算順序是: 彈出來的 (運算子)

    彈出來的

然後重複以上步驟,直到表示式的最左端,最後運算出的值則是表示式的值。

看完字首表示式的計算邏輯,那麼你要明白的是,從一個 中綴表示式 轉換為 字首表示式 時,優先順序順序是已經處理好的,因為在求值時,不進行優先順序的判定

例如:(3+4)x5-6 對應的字首表示式為:- x + 3 4 5 6,字首表示式求值步驟如下:

  1. 從右到左掃描,將 6、5、4、3 壓入棧

  2. 遇到 + 運算子時:

    將彈出 3 和 4(3 為棧頂元素,4 為次頂元素),計算出 3 + 4 = 7,將結果壓入棧

  3. 遇到 x 運算子時

    將彈出 7 和 5,計算出 7 x 5 = 35,將 35 壓入棧

  4. 遇到 -

    運算子時

    將彈出 35 和 6,計算出 35 - 6 = 29,壓入棧

  5. 掃描結束,棧中留下的唯一一個數字 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 + =

字尾表示式求值過程

  1. 左到右 掃描表示式

  2. 遇到 數字 時,將數字壓入堆疊

  3. 遇到 運算子

    彈出棧頂的兩個數(棧頂和次頂),用運算子對它們做相應的計算,並將結果入棧。

    計算順序是: 彈出來的 (運算子) 彈出來的

    同樣的也不用考慮符號優先順序的問題

然後重複以上步驟,直到表示式的最右端,最後運算得出的值即為表示式的結果。

比如:(3+4)x5-6 對應的字尾表示式 3 4 + 5 x 6 -

  1. 從左到右掃描,將 3、4 壓入堆疊

  2. 掃描到 + 運算子時

    將彈出 4 和 3,計算 3 + 4 = 7,將 7 壓入棧

  3. 將 5 入棧

  4. 掃描到 x 運算子時

    將彈出 5 和 7 ,計算 7 x 5 = 35,將 35 入棧

  5. 將 6 入棧

  6. 掃描到 - 運算子時

    將彈出 6 和 35,計算 35 - 6 = 29,將 29 壓入棧

  7. 掃描表示式結束,29 是表示式的值,由此得出最終結果