這裏所謂的前綴,中綴,後綴是根據操做符的位置來定的,若是操做符在操做數前面,則稱爲前綴表達式,例如「- + 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 -」(須要逆序輸出)計算機