正常表示式(中綴表示式)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 如果遇到操作符,則我們將其放入到棧...