字尾表示式的求值的演算法
1 字尾表示式的求值
將中綴表示式轉換成等價的字尾表示式後,求值時,不需要再考慮運算子的優先順序,只需從左到右掃描一遍字尾表示式即可。具體求值步驟為:從左到右掃描字尾表 達式,遇到運算子就把表示式中該運算子前面兩個運算元取出並運算,然後把結果帶回字尾表示式;繼續掃描直到字尾表示式最後一個表示式。
例如,字尾表示式(abc*+def*/-) 的求值
2 字尾表示式的求值的演算法
設定一個棧,開始時,棧為空,然後從左到右掃描字尾表示式,若遇運算元,則進棧;若遇運算子,則從棧中退出兩個元素,先退出的放到運算子的右邊,後退出的 放到運算子左邊,運算後的結果再進棧,直到字尾表示式掃描完畢。此時,棧中僅有一個元素,即為運算的結果。
例,求字尾表示式:1 2 + 8 2 - 7 4 - / * 的值,
棧的變化情如下:
步驟 |
棧中元素 |
說明 |
1 |
1 |
1 進棧 |
2 |
12 |
2 進棧 |
3 |
|
遇+ 號退棧2 和1 |
4 |
3 |
1+2=3 的結果3 進棧 |
5 |
38 |
8 進棧 |
6 |
382 |
2 進棧 |
7 |
3 |
遇- 號退棧2 和8 |
8 |
36 |
8-2=6 的結果6 進棧 |
9 |
367 |
7 進棧 |
10 |
3674 |
4 進棧 |
11 |
36 |
遇- 號退棧4 和7 |
12 |
36 |
7-4=3 的結果3 進棧 |
13 |
3 |
遇/ 號退棧3 和6 |
14 |
32 |
6/3=2 的結果2 進棧 |
15 |
|
遇* 號退棧2 和3 |
16 |
6 |
3*2=6 進棧 |
17 |
6 |
掃描完畢,運算結束 |
從上可知,最後求得的字尾表示式之值為6 ,與用中綴表示式求得的結果一致,但字尾式求值要簡單得多。
五、中綴表示式變成等價的字尾表示式的演算法
將中綴表示式變成等價的字尾表示式,表示式中運算元次序不變,運算子次序發生變化,同時去掉了圓括號。轉換規則是:設立一個棧,存放運算子,首先棧為空, 編譯程式從左到右掃描中綴表示式,若遇到運算元,直接輸出,並輸出一個空格作為兩個運算元的分隔符;若遇到運算子,則必須與棧頂比較,運算子級別比棧頂級 別高則進棧,否則退出棧頂元素並輸出,然後輸出一個空格作分隔符;若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止。當棧變成空時, 輸出的結果即為字尾表示式。將中綴表示式(1+2)*((8-2)/(7-4)) 變成等價的字尾表示式。
現在用棧來實現該運算,棧的變化及輸出結果如下:
步驟 |
棧中元素 |
輸出結果 |
說明 |
1 |
( |
|
( 進棧 |
2 |
( |
1 |
輸出1 |
3 |
(+ |
1 |
+ 進棧 |
4 |
(+ |
1 2 |
輸出2 |
5 |
|
1 2 + |
+ 退棧輸出,退棧到( 止 |
6 |
* |
1 2 + |
* 進棧 |
7 |
*( |
1 2 + |
( 進棧 |
8 |
*(( |
1 2 + |
( 進棧 |
9 |
*(( |
1 2 + 8 |
輸出8 |
10 |
*((- |
1 2 + 8 |
輸出2 |
11 |
*((- |
1 2 + 8 2 |
- 進棧 |
12 |
*( |
1 2 + 8 2 - |
- 退棧輸出,退棧到( 止 |
13 |
*(/ |
1 2 + 8 2 - |
/ 進棧 |
14 |
*(/( |
1 2 + 8 2 - |
( 進棧 |
15 |
*(/( |
1 2 + 8 2 - 7 |
輸出7 |
16 |
*(/(- |
1 2 + 8 2 - 7 |
- 進棧 |
17 |
*(/(- |
1 2 + 8 2 - 7 4 |
輸出4 |
18 |
*(- |
1 2 + 8 2 - 7 4 - |
- 退棧輸出,退棧到( 止 |
19 |
* |
1 2 + 8 2 - 7 4 - / |
/ 退棧輸出,退棧到( 止 |
20 |
|
1 2 + 8 2 - 7 4 - / * |
* 退棧並輸出 |
相關文章
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 【資料結構】棧的應用---四則運算表示式求值(中綴表示式與字尾表示式轉換)資料結構
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- 棧的應用---字尾表示式
- 一種簡易的表示式求值演算法演算法
- 3.2.5 表示式求值
- 將中綴表示式轉換為字尾表示式的簡便方法
- 資料結構與演算法——棧(五)中綴表示式轉字尾表示式資料結構演算法
- 棧在表示式求值中的應用
- 算術表示式的字首式、中綴式、字尾式相互轉換
- Java表示式求值引擎 - AviatorJava
- 【棧】【字串語法】牛牛與字尾表示式字串
- 【演算法】E.W.Dijkstra算術表示式求值演算法
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 利用Lambda表示式進行Java中的惰性求值Java
- C#字尾表示式解析計算字串公式C#字串公式
- 教你如何在C++中實現中綴表示式轉字尾表示式C++
- 將算數表示式轉換成字尾表示式並計算結果
- CF552E 字串 表示式求值字串
- 演算法手記(2)Dijkstra雙棧算術表示式求值演算法演算法
- 前端菜鳥的每週一道演算法題(一) - 逆波蘭表示式求值前端演算法
- C#資料結構與演算法系列(十):逆波蘭計算器——逆波蘭表示式(字尾表示式)C#資料結構演算法
- 逆波蘭表示式求值 golang VS pythonGolangPython
- 逆波蘭表示式求值——棧與佇列佇列
- js實現四則計算(中綴,字尾表示式)JS
- [藍橋杯 2019 省 B] 字尾表示式
- 力扣-150. 逆波蘭表示式求值力扣
- 中綴轉字尾表示式思路分析和程式碼實現
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- LeetCode-150- 逆波蘭表示式求值LeetCode
- Leetcode——150. 逆波蘭表示式求值LeetCode
- 【資料結構】棧的應用——中綴表示式求值(c++)資料結構C++
- C語言- 基礎資料結構和演算法 - 09 棧的應用_中綴表示式轉字尾表示式20220611C語言資料結構演算法
- 4、逆波蘭表示式求值——棧(java資料結構)Java資料結構
- 算數表示式求值--c語言課程設計C語言
- 使用棧實現表示式求值,運用棧計算
- POJ-3337 Expression Evaluator-表示式求值Express
- PostgreSQL 原始碼解讀(164)- 查詢#84(表示式求值)SQL原始碼