這裡所謂的字首,中綴,字尾是根據操作符的位置來定的,如果操作符在運算元前面,則稱為字首表示式,例如「- + 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棧頂為左括號,運算子直接入棧
31 2 3
+ ( ( +數字)
1 2 3 +
+ (右括號,彈出運算子直至遇到左括號
×1 2 3 +
+ ( ×
s1棧頂為左括號,運算子直接入棧
41 2 3 + 4
+ ( ×數字)
1 2 3 + 4 ×
+右括號,彈出運算子直至遇到左括號
-1 2 3 + 4 × +
--與+優先順序相同,因此彈出+,再壓入-
51 2 3 + 4 × + 5-數字
到達最右端
1 2 3 + 4 × + 5 -
空s1中剩餘的運算子
因此結果為「1 2 3 + 4 × + 5 -」(需要逆序輸出)
字首 中綴 字尾表示式
它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...
字首 中綴 字尾表示式
最近筆試的過程中老是有中綴轉換為字首,或是中綴轉換為字尾的問題,資料結構學了這麼久真的是記不清了,今天重新複習了一下,藉此機會總結一下 中綴 我們正常理解的表示式的書寫方式 字首 操作符全部位於運算元的前面,運算元的順序為從右到左依次壓棧的順序,操作符為從左到右依次壓棧的順序 字尾 不包含括號,運算...
字首 中綴 字尾表示式
它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...