中綴表達式(infix):
數(shù)學(xué)里面的公式就是中綴表達式刻蟹,是我們生活中里面常用的表達式大州,比如說 a*(b+c)
部念, 中綴表達式可以用括號來調(diào)整優(yōu)先級邀窃。
后綴表達式(postfix):
運算符放在兩個運算對象的后面,所有的計算按運算符出現(xiàn)的順序锦积,嚴格從左向右進行(不用考慮運算符的優(yōu)先級)芒帕,如 a*(b+c)
,轉(zhuǎn)化為后綴表達式 即a b + 3 *
丰介。
轉(zhuǎn)換規(guī)則:
從頭到尾讀取中綴表達式中的每個對象背蟆, 對不同對象按不同情況處理。
- 運算數(shù): 直接輸出哮幢;
- 左括號: 壓入堆棧带膀;
- 右括號: 將棧頂?shù)倪\算符彈出并輸出, 直到遇到左括號橙垢,
(
出棧不輸出垛叨; - 運算符:
- 若優(yōu)先級大于棧頂運算符時, 則把它壓入棧柜某;
- 若優(yōu)先級小于等于棧頂運算符時嗽元,將棧頂運算符彈出并輸出; 再比較新的棧頂運算符喂击, 直到該運算符大于棧頂運算符優(yōu)先級為止剂癌,然后將該運算符壓入棧;
- 若將個對象處理完畢翰绊, 則把堆棧中存留的運算符一并輸出佩谷;
例如將中綴表達式2 * (9 + 6 / 3 - 5) + 4
轉(zhuǎn)化為后綴表達式2 9 6 3 / + 5 - * 4 +
轉(zhuǎn)換步驟如下:
- 遇到數(shù)字
2
, 直接輸出
表達式:2
符號棧:
- 遇到符號
*
监嗜,棧頂沒有符號琳要,直接入棧
表達式: 2
符號棧: *
- 遇到符號
(
, 壓入棧
表達式:2
符號棧:* (
- 遇到數(shù)字
9
秤茅, 直接輸出
表達式:2 9
符號棧:* (
- 遇到符號
+
稚补,( )
里面的+
, 比外面的*
優(yōu)先級高框喳, 壓入棧
表達式:2 9
符號棧:* ( +
- 遇到數(shù)字
6
, 直接輸出
表達式:2 9 6
符號棧:* ( +
- 遇到符號 \ 课幕,優(yōu)先級大于
+
,壓入棧
表達式:2 9 6
符號棧:* ( + \
- 遇到數(shù)字
3
五垮, 直接輸出
表達式:2 9 6 3
符號棧:* ( + \
- 遇到符號
-
乍惊, 優(yōu)先級小于 \ , \ 彈出棧
表達式:2 9 6 3
符號棧:* ( +
- 繼續(xù)比較放仗,
+
優(yōu)先級等于-
润绎,+
彈出棧
表達式:2 9 6 3 \ +
符號棧:* (
- 繼續(xù)比較,
-
優(yōu)先級大于(
, 壓入棧
表達式:2 9 6 3 \ +
符號棧:* ( -
- 遇到數(shù)字
5
, 直接輸出
表達式:2 9 6 3 \ + 5
符號棧:* ( -
- 遇到符號
)
莉撇,將(
和(
之前的的符號彈出棧
表達式:2 9 6 3 \ + 5 -
符號棧:*
- 遇到符號
+
呢蛤, 小于*
,*
彈出棧
表達式:2 9 6 3 \ + 5 - *
符號棧:
- 再比較,棧頂沒有符號棍郎,直接壓入棧
表達式:2 9 6 3 \ + 5 - *
符號棧:+
- 遇到數(shù)字
4
直接輸出
表達式:2 9 6 3 \ + 5 - * 4
符號棧:+
- 處理完畢其障, 一并輸出
表達式:2 9 6 3 \ + 5 - * 4 +
符號棧: