中綴表示式 轉 字尾表示式 逆波蘭表示式 及計算

2021-08-24 20:47:57 字數 1926 閱讀 3298

正常表示式(中綴表示式)3+4*5-6

對應的字尾表示式(逆波蘭表示式):3 4 5 * + 6 -

中綴表示式看成乙個字串,從左到右開始掃瞄中綴表示式:

遇到運算元:直接輸出(新增到字尾表示式中)

棧為空時,遇到運算子,直接入棧

遇到左括號:將其入棧

遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,括號不輸出。

遇到其他運算子:加減乘除:彈出所有優先順序大於或者等於該運算子的棧頂元素,然後將該運算子入棧

最終將棧中的元素依次出棧,輸出。

示例:中綴表示式 「1+((2+3)×4)-5」

掃瞄到的元素

s1棧(結果棧)

s2棧 (符號棧)

過程

1      |    1           |     空          | 數字直接進入s1棧

+ | 1 | + | s2空,符號進入s2棧

( | 1 | +( | 左括號直接入棧s2

( | 1 | +(( | 左括號直接入棧s2

2 | 12 | +(( | 數字直接進入s1棧

+ | 12 | +((+ | s2棧頂為左括號直接棧

3 | 123 | +((+ | 數字直接進入s1棧

) | 123+ | +( | 右括號,彈出運算子直至遇到左括號

x | 123+ | +(x | s2棧頂是左括號,運算子直接入棧

4 | 123+4 | +(x | 數字直接進入s1棧

) | 123+4x | + | 右括號,彈出運算子直至遇到左括號

- | 123+4x+ | - | s2棧頂是+與 -同級,彈出+,在壓入-

5 | 123+4x+5 | - | 數字

空 | 123+4x+5- | 空 | 當表示式為空時順序彈出s2棧中符號壓入s1棧中

結果 123+4x+5-計算規則

按順序從左到右掃瞄字尾表示式,數字直接入棧,遇到符號取出棧頂兩個數字進行計算,計算結果壓入棧中

繼續掃瞄直到結束

掃瞄到的元素

s1棧(結果棧)

過程

1      |    1           | 數字直接進入s1棧

2 | 1 2 | 數字直接進入s1棧

3 | 1 2 3 | 數字直接進入s1棧

+ | 1 5 | 遇到+ 2 3兩個棧頂元素出棧 計算2+3 結果5入棧

4 | 1 5 4 | 數字直接進入s1棧

x | 1 20 | 遇到x 4 5兩個棧頂元素出棧 計算4x5 結果20入棧

+ | 21 | 數字直接進入s1棧

5 | 21 5 | 遇到- 21 5兩個棧頂元素出棧 計算21-5 結果16入棧

- | 16 | s2棧頂是左括號,運算子直接入棧

空 | 16 | 結果16

中綴表示式轉字尾(逆波蘭)表示式

原則 從左到右遍歷中綴表示式 1 如果是數字則直接輸出 2 如果是左括號,直接入棧 3 如果是右括號,直接棧頂元素出棧並輸出,直到遇到左括號,左括號只出棧,不輸出 4 如果是符號,如果優先順序不高於棧頂符號則棧頂元素依次出棧並輸出 如果遇到 符號,如果棧非空並且棧頂元素不是左括號,則出棧並且輸出,否...

逆波蘭表示式 中綴表示式 字尾表示式

1 我們這裡要實現的是 將中綴表示式轉換成字尾表示式,然後再計算最終結果,參考部落格。具體轉化演算法如下 中綴表示式a b c d e f g,其轉換成字尾表示式則為abc de f g 轉換過程需要用到棧,具體過程如下 1 如果遇到運算元,我們就直接將其輸出。2 如果遇到操作符,則我們將其放入到棧...

逆波蘭表示式 中綴表示式 字尾表示式

1 我們這裡要實現的是 將中綴表示式轉換成字尾表示式,然後再計算最終結果,參考部落格。具體轉化演算法如下 中綴表示式a b c d e f g,其轉換成字尾表示式則為abc de f g 轉換過程需要用到棧,具體過程如下 1 如果遇到運算元,我們就直接將其輸出。2 如果遇到操作符,則我們將其放入到棧...