表示式字首 中綴 字尾

2021-08-28 20:49:30 字數 1456 閱讀 7210

這裡所謂的字首,中綴,字尾是根據操作符的位置來定的,如果操作符在運算元前面,則稱為字首表示式,例如「- + 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 字尾表示式 中綴表示式 中綴記法 中綴表示式...