假設(shè)算術(shù)表達式只包含”+”、“-”、“*”、“/”、正整數(shù)和括號的合法數(shù)學(xué)表達式,求算術(shù)表達式值。
過程是利用了先將算術(shù)表達式(中綴表達式)轉(zhuǎn)換成后綴表達式,然后對后綴表達式求值! 具體的中綴表達式和后綴表達式是什么可以參考 http://www.bkjia.com/cjjc/1170210.html 的前一部分。
(一)具體的中綴表達式轉(zhuǎn)換成后綴表達式的法則:
1.遇到操作數(shù)直接輸出 2.若遇到右括弧“)”,則連續(xù)出棧輸出,直到遇到左括弧“(”為止。其中,左括弧出棧但是并不輸出 3.若是其他操作符,則和棧頂?shù)牟僮鞣容^優(yōu)先級,若小于等于棧頂操作符的優(yōu)先級,則連續(xù)出棧輸出,直到某一位的優(yōu)先級值大于棧頂操作符的優(yōu)先級結(jié)束,操作符進棧; 4.輸出棧中剩余的操作符。
實現(xiàn)這個轉(zhuǎn)換的關(guān)鍵是確定操作符的優(yōu)先級,因為優(yōu)先級決定操作符是否進棧和出棧,同時操作符在棧內(nèi)外的優(yōu)先級不同,換種說法,符號入棧前有個比較的時候按照棧外值查表,但凡已經(jīng)在棧內(nèi)的需要按棧內(nèi)表查!!!(越大越高)
棧外:
符號 | ( | *和/ | +和- | ) |
---|---|---|---|---|
7 | 5 | 3 | 1 |
棧內(nèi):
符號 | ( | *和/ | +和- | ) |
---|---|---|---|---|
1 | 5 | 3 | 7 |
不要糾結(jié)上面值大小,其實只是為了分辨一下優(yōu)先級罷了。
(二)后綴表達式計算的法則: 從左往右掃描后綴表達式,遇到操作數(shù)就進棧,遇到操作符就從棧中彈出兩個操作數(shù),執(zhí)行相應(yīng)的運算,并將結(jié)果進棧。如此下去,直到遇到結(jié)尾符#結(jié)束,彈出的棧頂元素就是結(jié)果。注意這里只討論雙目運算符,在彈出的兩個操作數(shù)棧,先出棧的放在操作符的右邊,后出棧的放在左邊。
然后給大家一道例題:藍橋杯 表達式計算原題鏈接
具體的實現(xiàn)可以看我的博客如下: 藍橋杯題目解答
新聞熱點
疑難解答