數(shù)學意義上,加減乘除運算被稱為“四則運算”,如1+2*3-4
,“四則運算”算法主要分兩步:第一步是中綴表達式轉(zhuǎn)后綴表達式,第二步是計算后綴表達式得到結(jié)果。
一般情況下,四則運算的表達式為中綴表達式,比如表達式 A+(B-C/D)*E
,該表達式的中綴表達式與后綴表達式如下:
A+(B-C/D)*E
ABCD/-E*+
中綴表達式將操作符置于兩個操作數(shù)中;后綴表達式將操作符置于兩個操作數(shù)之后;另外,后綴表達式已經(jīng)去除括號,并且定義了運算的先后順序,稍后我們來分析。
中后綴表達式中的字符有操作數(shù)和操作符之分:
+-*/()
(稍后運算用到的#
符號也是)ABCDE
也就是說,我們將加(+)、減(-)、乘(*)、除(/)、和括號("()")稱作操作符,將運算的字符A、B、C、D、E稱作操作數(shù)。
將中綴表達式轉(zhuǎn)為后綴表達式,需要
- 一個操作符棧 —— 后進先出 LIFO
- 一個字符隊列 —— 先進先出 FIFO
- 定義操作符優(yōu)先級
其中,操作符棧 存儲操作符,并對操作符進行入棧出棧操作;字符隊列存儲轉(zhuǎn)換前后的表達式;操作符優(yōu)先級定義了棧內(nèi)以及棧外各個操作符的優(yōu)先級。
操作符優(yōu)先級規(guī)則如下:
* /
優(yōu)先級相同,+ -
優(yōu)先級相同- 優(yōu)先級:
* /
>+ -
;- 同一優(yōu)先級(比如
+ -
):先進棧 < 后進棧;- 井號
#
優(yōu)先級最低- 在棧外,左括號
(
優(yōu)先級最高;在棧內(nèi),(
優(yōu)先級除井號 # 外最低- 總的來說,在棧外
(
>* /
>+ -
>)
> '#';在棧內(nèi)* /
>+ -
>)
>(
>#
計算后綴表達式,需要
- 一個操作數(shù)棧 —— 后進先出 LIFO
- 一個字符隊列 —— 先進先出 FIFO
主要的過程為:
表達式 A+(B-C/D)*E
中綴轉(zhuǎn)后綴流程參見如下 PPT 演示:中綴轉(zhuǎn)后綴流程
主要的過程為:
表達式 ABCD/-E*+
計算后綴表達式流程參見如下 PPT 演示:計算后綴表達式流程
下面演示一個簡單的示例,演示通過中綴表達式轉(zhuǎn)后綴表達式,并計算后綴表達式來計算 1+(3-4/2)*5
的過程:
表達式 1+(3-4/2)*5
中綴轉(zhuǎn)后綴流程參見如下 PPT 演示:中綴轉(zhuǎn)后綴示例
表達式 1342/-5*+
計算后綴表達式流程參見如下 PPT 演示:計算后綴表達式示例