1. 程式人生 > >逆波蘭式(字尾表示式)的表達求值

逆波蘭式(字尾表示式)的表達求值

逆波蘭表示式求值

[編輯]虛擬碼

  • while有輸入符號
    • 讀入下一個符號
    • IF是一個運算元
      • 入棧
    • ELSE IF是一個操作符
      • 有一個先驗的表格給出該操作符需要n個引數
      • IF堆疊中少於n個運算元
        • (錯誤) 使用者沒有輸入足夠的運算元
      • Else,n個操作數出棧
      • 計算操作符。
      • 將計算所得的值入棧
  • IF棧內只有一個值
    • 這個值就是整個計算式的結果
  • ELSE多於一個值
    • (錯誤) 使用者輸入了多餘的運算元

[編輯]例子

中綴表示式“5 + ((1 + 2) * 4) − 3”寫作

5 1 2 + 4 * + 3 −

下表給出了該逆波蘭表示式從左至右求值的過程,堆疊欄給出了中間值,用於跟蹤演算法。

輸入 操作 堆疊 註釋
5 入棧 5
1 入棧 5, 1
2 入棧 5, 1, 2
+ 加法運算 5, 3 (1, 2)出棧;將結果(3)入棧
4 入棧 5, 3, 4
* 乘法運算 5, 12 (3, 4)出棧;將結果(12)入棧
+ 加法運算 17 (5, 12)出棧;將結果 (17)入棧
3 入棧 17, 3
減法運算 14 (17, 3)出棧;將結果(14)入棧

計算完成時,棧內只有一個運算元,這就是表示式的結果:14

上述運算可以重寫為如下運算鏈方法(用於HP的逆波蘭計算器):[3]

1 2 + 4 * 5 + 3 −