算術表示式的字首式、中綴式、字尾式相互轉換
中綴表示式(中綴記法)
中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。
雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計算機來說,計算字首或字尾表示式的值非常簡單。
字首表示式(字首記法、波蘭式)
字首表示式的運算子位於運算元之前。
字首表示式的計算機求值:
從右至左掃描表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果。
例如字首表示式“- × + 3 4 5 6”:
(1) 從右至左掃描,將6、5、4、3壓入堆疊;
(2) 遇到+運算子,因此彈出3和4(3為棧頂元素,4為次頂元素,注意與字尾表示式做比較),計算出3+4的值,得7,再將7入棧;
(3) 接下來是×運算子,因此彈出7和5,計算出7×5=35,將35入棧;
(4) 最後是-運算子,計算出35-6的值,即29,由此得出最終結果。
可以看出,用計算機計算字首表示式的值是很容易的。
詳細解釋:http://blog.csdn.net/antineutrino/article/details/6763722/
給出一箇中綴表示式如下:
a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號,
式子變成了:((a+(b*c))-(d+e))
第二步:轉換字首與字尾表示式
字首:把運算子號移動到對應的括號前面
則變成了:-( +(a *(bc)) +(de))
把括號去掉:-+a*bc+de 字首式子出現
字尾:把運算子號移動到對應的括號後面
則變成了:((a(bc)* )+ (de)+ )-
把括號去掉:abc*+de+- 字尾式子出現
<1> 將中綴表示式“1+((2+3)*4)-5”轉換為字首表示式。
(1)構建兩個棧,一個存運算子一個存運算元。運算子(以括號分界點)在棧內遵循越往棧頂優先順序不降低的原則排序。
(2)從右往左掃描中綴式表示式,從右邊第一個字元開始判斷。
如果當前字元是數字,則分配到數字串的結尾並將數字串直接輸出。
如果是運算子,則比較優先順序。如果當前運算子的優先順序大於等於棧頂運算子的優先順序(當棧頂是括號時,直接入棧),則將運算子直接入棧;否則將棧頂運 算符出棧並輸出,直到當前運算子的優先順序大於等於棧頂運算子的優先順序(當棧頂元素是括號直接入棧),再將當前運算子入棧。如果是括號,則根據括號的 方向進行處理。如果是括號直接入棧;否則,遇右括號前將所有的運算子全部出棧並輸出,遇右括號後將左右的兩括號一起刪除。
(3)重複上述操作(2)直至掃描結束,將棧內剩餘運算子全部出棧並輸出,再將綴輸出字串。中綴表示式就變成了字首表示式了。
中綴表示式
|
字首表示式
|
(棧頂)運算子棧(棧尾)
|
說明
|
5
|
5
|
空
|
5,是數字串直接輸出
|
-
|
5
|
-
|
-,棧內無運算子,直接入棧
|
)
|
5
|
-)
|
),直接入棧
|
4
|
5 4
|
-)
|
4,是數字串直接輸出
|
*
|
5 4
|
-)*
|
*,棧頂是括號,直接入棧
|
)
|
5 4
|
- ) * )
|
),直接入棧
|
3
|
5 4 3
|
- ) * )
|
3,是數字串直接輸出
|
+
|
5 4 3
|
- ) * ) +
|
+,棧頂是括號,直接入棧
|
2
|
5 4 3 2
|
- ) * )+
|
2,是數字串直接輸出
|
(
|
5 4 3 2+
|
- ) *
|
(,
|
(
|
5 4 3 2+*
|
-
|
(,
|
+
|
5 4 3 2+*
|
-+
|
+,優先順序大於等於棧頂運算子,直接入棧
|
1
|
5 4 3 2+*1
|
-+
|
1,是數字串直接輸出
|
空
|
5 4 3 2+*1+-
|
空
|
掃描結束,將棧內剩餘運算子全部出棧並輸出
|
空
|
- + 1 * + 2 3 4 5
|
空
|
逆綴輸出字串
|
【2】中綴表示式轉換為字尾表示式
過程和【1】差不多,只不過是從左往右掃描,方向換了一個,其他一樣。
還是這個式子:1+((2+3)*4)-5
中綴表示式
|
字尾表示式
|
(棧頂)運算子棧(棧尾)
|
說明
|
1
|
1
|
空
|
1,是數字串直接輸出
|
+
|
1
|
+
|
+,棧內無運算子,直接入棧
|
(
|
1
|
+(
|
(,直接入棧
|
(
|
1
|
+((
|
(,直接入棧
|
2
|
1 2
|
+((
|
2 ,數字
|
+
|
1 2
|
+((+
|
+,直接入棧
|
3
|
1 2 3
|
+((+
|
3,是數字串直接輸出
|
)
|
1 2 3 +
|
+(
|
碰到 )找到(之前所有符號彈出出
|
*
|
1 2 3 +
|
+(*
|
*
|
4
|
1 2 3 + 4
|
+(*
|
4
|
)
|
1 2 3 + 4 *
|
+
|
碰到 )找到(之前所有符號彈出出
|
-
|
1 2 3 + 4 *
|
+ -
|
-
|
5
|
1 2 3 + 4 *5
|
+ -
|
5
|
空
|
1 2 3 + 4 *5 - +
|
空
|
掃描結束
|
空
|
1 2 3 + 4 *5 - +
|
空
|
逆綴輸出字串
|
字尾表示式逆向求解中綴表示式
相關文章
- 將中綴表示式轉換為字尾表示式的簡便方法
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- 【資料結構】棧的應用---四則運算表示式求值(中綴表示式與字尾表示式轉換)資料結構
- 教你如何在C++中實現中綴表示式轉字尾表示式C++
- js實現四則計算(中綴,字尾表示式)JS
- 將算數表示式轉換成字尾表示式並計算結果
- 資料結構與演算法——棧(五)中綴表示式轉字尾表示式資料結構演算法
- 計算中綴表示式
- 中綴表示式轉為逆波蘭表示式
- 中綴轉字尾表示式思路分析和程式碼實現
- 中綴表示式
- 使用棧結構計算中綴表示式
- 資料結構 中綴表示式轉化資料結構
- 棧的應用---字尾表示式
- C#字尾表示式解析計算字串公式C#字串公式
- 中綴表示式的計算,C++版本,Linux環境C++Linux
- 字尾表示式的求值的演算法演算法
- C語言- 基礎資料結構和演算法 - 09 棧的應用_中綴表示式轉字尾表示式20220611C語言資料結構演算法
- numtoyminterval函式——數字轉換函式函式
- C++ 表示式中的型別轉換C++型別
- 【棧】【字串語法】牛牛與字尾表示式字串
- python--表示式(運算表示式)Python
- 【計算機演算法】 求字首表示式的值計算機演算法
- NYOJ--字首式計算
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- C#中的Lambda表示式和表示式樹C#
- 函式式 Java 到函式式 Kotlin 的轉換函式JavaKotlin
- C#資料結構與演算法系列(十):逆波蘭計算器——逆波蘭表示式(字尾表示式)C#資料結構演算法
- 3-06. 表示式轉換(25)
- 【資料結構】棧的應用——中綴表示式求值(c++)資料結構C++
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- js顯式轉換和隱式轉換JS
- angular中的表示式Angular
- SQLite中的表示式SQLite
- Scala中的單例以及鏈式表示式單例
- [藍橋杯 2019 省 B] 字尾表示式
- 表示式編譯計算器(下) (轉)編譯