前綴、中綴、后綴表達式
前綴、中綴、后綴表達式是對表達式的不同記法,其區別在於運算符相對於操作數的位置不同,前綴表達式的運算符位於操作數之前,中綴和后綴同理
舉例:
中綴表達式:1 + (2 + 3) × 4 - 5
前綴表達式:- + 1 × + 2 3 4 5
后綴表達式:1 2 3 + 4 × + 5 -
## 中綴表達式 中綴表達式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於操作數的中間。中綴表達式是人們常用的算術表示方法。 雖然人的大腦很容易理解與分析中綴表達式,但對計算機來說中綴表達式卻是很復雜的,因此計算表達式的值時,通常需要先將中綴表達式轉換為前綴或后綴表達式,然后再進行求值。 對計算機來說,計算前綴或后綴表達式的值非常簡單。
## 前綴表達式
前綴表達式的運算符位於兩個相應操作數之前,前綴表達式又被稱為前綴記法或波蘭式
前綴表達式的計算機求值
- 從右至左掃描表達式
- 遇到數字時,將數字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧
- 重復上述過程直到表達式最左端,最后運算得出的值即為表達式的結果
示例:
計算前綴表達式的值:- + 1 × + 2 3 4 5
- 從右至左掃描,將5,4,3,2壓入堆棧;
2)遇到+運算符,彈出2和3(2為棧頂元素,3為次頂元素),計算2+3的值,得到5,將5壓入棧;
3)遇到×運算符,彈出5和4,計算5×4的值,得到20,將20壓入棧;
4)遇到1,將1壓入棧;
5)遇到+運算符,彈出1和20,計算1+20的值,得到21,將21壓入棧;
6)遇到-運算符,彈出21和5,計算21-5的值,得到16為最終結果
可以看到,用計算機計算前綴表達式是非常容易的,不像計算后綴表達式需要使用正則匹配
## 后綴表達式
后綴表達式與前綴表達式類似,只是運算符位於兩個相應操作數之后,后綴表達式也被稱為后綴記法或逆波蘭式
后綴表達式的計算機求值
與前綴表達式類似,只是順序是從左至右:
- 從左至右掃描表達式
- 遇到數字時,將數字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們做相應的計算(次頂元素op 棧頂元素 ),並將結果入棧
- 重復上述過程直到表達式最右端,最后運算得出的值即為表達式的結果
示例:
計算
計算后綴表達式的值:1 2 3 + 4 × + 5 -
1)從左至右掃描,將1,2,3壓入棧;
2)遇到+運算符,3和2彈出,計算2+3的值,得到5,將5壓入棧;
3)遇到4,將4壓入棧
4)遇到×運算符,彈出4和5,計算5×4的值,得到20,將20壓入棧;
5)遇到+運算符,彈出20和1,計算1+20的值,得到21,將21壓入棧;
6)遇到5,將5壓入棧;
7)遇到-運算符,彈出5和21,計算21-5的值,得到16為最終結果
## 中綴表達式轉化為前綴和后綴表達式
轉化步驟:
- 按照運算符的優先級對所有的運算單位加括號
- 將運算符移動到對應括號的前面(前綴表達式)或后面(后綴表達式)
- 去掉括號,得到前綴或后綴表達式
示例:
中綴表達式:1+(2+3)×4-5
1)加括號
式子變成 ((1+((2+3)×4))-5)
2)移動運算符
對於前綴表達式,變成了 -(+(1×(+(23)4))5)
對於后綴表達式:變成了((1((23)+4)×)+5)-
3)去掉括號
前綴表達式: - + 1 × + 2 3 4 5
后綴表達式:1 2 3 + 4 × + 5 -
## 小結 - 前綴、中綴、后綴是根據運算符與操作數的相對位置來划分的 - 中綴表達式符合人的計算習慣,而前綴和后綴表達式適合計算機計算 - 前綴表達式和后綴表達式計算的時候都是從一個方向掃描表達式,遇到數字壓入棧,遇到運算符彈出棧頂的兩個數進行運算並將結果入棧,重復知道結束 - 前綴和后綴表達式已經內在地包含運算順序,因此不用括號來確定優先級