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

這裏所謂的前綴,中綴,後綴是根據操做符的位置來定的,若是操做符在操做數前面,則稱爲前綴表達式,例如「- + 1 × + 2 3 4 5」;若是操做符在操做數之間,則稱爲中綴表達式,例如數據結構

「1+((2+3)×4)-5」;若是操做符在操做數後面,則稱爲後綴表達式,例如「1 2 3 + 4 × + 5 -」。spa

 

雖然中綴表達式符合人類的平常思惟習慣,可是計算機在存儲中綴表達式時,須要使用樹這種數據結構,若是表達式過於複雜,那麼樹的高度會變得很高,大大增長了時間複雜度和空間複雜度。若是轉換成線性結構,那麼效率將變得高不少,因此須要將中綴表達式先轉換成前綴或者後綴表達式,而後依靠棧這種線性數據結構來進行計算。ci

 

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

 

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

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

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

 

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

 

將中綴表達式「1+((2+3)×4)-5」轉換爲後綴表達式的過程以下:top

掃描到的元素 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 -」(須要逆序輸出)計算機

相關文章
相關標籤/搜索