阿龙学堂-中缀-后缀表达式的计算
1、簡介
在數據結構中,有一種數據結構叫做:Stack,LIFO(Last In First Out),在這個結構中,有個后綴表達式計算,運用該數據結構進行計算。
棧是一種只允許一端操作的線性數據結構,具有LIFO(last in first out)的特點,具有廣泛的應用,如我在游戲編程模式--命令模式(2)中使用棧的結構來實驗撤銷、重做功能。現在打算用棧結構來實現后綴表達式的計算。
后綴表達式也叫逆波蘭表達式,其求值過程可以用到棧來輔助存儲。
2、后綴表達式
后綴表達式,指的是不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則)。
例如 5+(2+3)*4 轉換為后綴表達式為 523+4*+3、后綴表達式的計算
規則:從左向右掃描,遇到數字壓棧,遇到操作符,彈出棧頂的兩個元素,先彈出的元素在右邊,后彈出來的在左邊,進行計算后,將結果壓棧,再往后掃描,直到掃描結束,輸出棧頂元素,即為最終結果。
以 523+4*+為例
5壓棧 2壓棧 3壓棧 遇到+號,彈出3 2,計算2+3,將5壓棧,此時棧為5 5,將4壓棧,遇到*號,彈出4 5,計算5*4,將20壓棧 此時棧為5 20 ,遇到+號,計算5+20,將25壓棧,掃描結束,輸出25。
以上就是計算過程。下面用C++編寫代碼,為了方便標記算式的結束,在末尾我們加上#,用來標識算式結束,這里我們只進行四則運算
4、中綴表達式轉后綴表達式
4.1、規則
中綴表達式a + b*c + (d * e + f) * g,其轉換成后綴表達式則為a b c * + d e * f? + g * +。
轉換過程需要用到棧,具體過程如下:
1)如果遇到操作數,我們就直接將其輸出。2)如果遇到操作符,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。3)如果遇到一個右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出并不輸出。4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,從棧中彈出元素直到遇到發現更低優先級的元素(或者棧為空)為止。彈出完這些元素后,才將遇到的操作符壓入到棧中。有一點需要注意,只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。5)如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。4.2、實例
規則很多,還是用實例比較容易說清楚整個過程。以上面的轉換為例,輸入為a + b * c + (d * e + f)*g,處理過程如下:
1)首先讀到a,直接輸出。
2)讀到“+”,將其放入到棧中。
3)讀到b,直接輸出。
4)讀到“*”,因為棧頂元素"+"優先級比" * " 低,所以將" * "直接壓入棧中。
5)讀到c,直接輸出
6)讀到" + ",因為棧頂元素" * "的優先級比它高,所以彈出" * "并輸出, 同理,棧中下一個元素" + "優先級與讀到的操作符" + "一樣,所以也要彈出并輸出。然后再將讀到的" + "壓入棧中。
7)下一個讀到的為"(",它優先級最高,所以直接放入到棧中。
8)讀到d,將其直接輸出。
9)讀到" * ",由于只有遇到" ) "的時候左括號"("才會彈出,所以" * "直接壓入棧中。
10)讀到e,直接輸出。
11)讀到" + ",彈出" * "并輸出,然后將"+"壓入棧中。
12)讀到f,直接輸出。
13)接下來讀到“)”,則直接將棧中元素彈出并輸出直到遇到"("為止。這里右括號前只有一個操作符"+"被彈出并輸出。
14)讀到" * ",壓入棧中。讀到g,直接輸出。
15)此時輸入數據已經讀到末尾,棧中還有兩個操作符“*”和" + ",直接彈出并輸出。至此整個轉換過程完成。程序實現代碼后續再補充了。
4.3、轉換的另一種方法
1)先按照運算符的優先級對中綴表達式加括號,變成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )2)將運算符移到括號的后面,變成((a(bc)*)+(((de)*f)+g)*)+3)去掉括號,得到abc*+de*f+g*+?
?
具體細節關注微信公眾號? ?【阿龍學堂】
總結
以上是生活随笔為你收集整理的阿龙学堂-中缀-后缀表达式的计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是心跳包
- 下一篇: C# 流不可读 解决办法