逆波蘭式(字尾表示式)的表達求值
阿新 • • 發佈:2019-01-03
逆波蘭表示式求值
[編輯]虛擬碼
- 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 −