算術表達式的前綴表達式,中綴表達式和后綴表達式


這里所謂的前綴,中綴,后綴是根據操作符的位置來定的,如果操作符在操作數前面,則稱為前綴表達式,例如“- + 1 × + 2 3 4 5”;如果操作符在操作數之間,則稱為中綴表達式,例如

“1+((2+3)×4)-5”;如果操作符在操作數后面,則稱為后綴表達式,例如“1 2 3 + 4 × + 5 -”。

 

雖然中綴表達式符合人類的日常思維習慣,但是計算機在存儲中綴表達式時,需要使用樹這種數據結構,如果表達式過於復雜,那么樹的高度會變得很高,大大增加了時間復雜度和空間復雜度。如果轉換成線性結構,那么效率將變得高很多,所以需要將中綴表達式先轉換成前綴或者后綴表達式,然后依靠棧這種線性數據結構來進行計算。

 

前綴表達式又叫波蘭表達式,后綴表達式又叫逆波蘭表達式。前綴表達式基本沒有在商業計算機中使用過,所以現實中用的更多的是后綴表達式。

 

如何將中綴表達式轉化成后綴表達式呢?

利用兩個棧S1,S2:其中S1存放操作符,S2存放操作數

從左往右遍歷中綴表達式,如果遇到數字,則放入S2中,如果遇到操作符,則放入S1中。在放操作符的時候有一定的規則,如果棧為空或棧頂元素為(,則直接壓棧。如果是(,也直接壓棧;如果棧頂元素為普通操作符,則比較優先級,如果待壓棧的操作符比棧頂操作符優先級高,則直接壓棧,否則將S1中的棧頂元素出棧,並壓入S2中,再接着比較S1棧頂元素的優先級。如果遇到),則依次彈出S1棧頂的運算符,並壓入S2,直到遇到左括號為止,此時將這一對括號丟棄。最后將S1中剩余的運算符依次彈出並壓入S2,逆序輸出S2(從棧底到棧頂)便得到了后綴表達式。(注意:等號的優先級最低,因為要到最后才進行賦值操作)

 

得到后綴表達式之后,計算就變得方便多了,遇到數字就壓棧,遇到操作符的時候,pop出棧頂的兩個元素,進行計算后將結果又壓入棧中,這樣一直下去,直到得到最終結果。

 

將中綴表達式“1+((2+3)×4)-5”轉換為后綴表達式的過程如下:

掃描到的元素 S2(棧底->棧頂) S1 (棧底->棧頂) 說明
1 1 數字,直接入棧
+ 1 + S1為空,運算符直接入棧
( 1 + ( 左括號,直接入棧
( 1 + ( ( 同上
2 1 2 + ( ( 數字
+ 1 2 + ( ( + S1棧頂為左括號,運算符直接入棧
3 1 2 3 + ( ( + 數字
) 1 2 3 + + ( 右括號,彈出運算符直至遇到左括號
× 1 2 3 + + ( × S1棧頂為左括號,運算符直接入棧
4 1 2 3 + 4 + ( × 數字
) 1 2 3 + 4 × + 右括號,彈出運算符直至遇到左括號
- 1 2 3 + 4 × + - -與+優先級相同,因此彈出+,再壓入-
5 1 2 3 + 4 × + 5 - 數字
到達最右端 1 2 3 + 4 × + 5 - S1中剩余的運算符


因此結果為“1 2 3 + 4 × + 5 -”(需要逆序輸出)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM