用棧解析算術表示式 Python版

2021-08-24 19:26:53 字數 1598 閱讀 1450

**中採用了三步實現算術表示式的解析:

1. 將算術表示式(字串)轉換成乙個列表parseelement方法

2. 將列表表示的算術表示式轉換成字尾表示式changetosuffix

3. 計算字尾表示式的結果

這裡我是為了方便, 就寫了個parseelement, 不想那方法寫到後面卻把自己繞住了, 可以想象乙個帶自增, 位, 邏輯, 算術的表示式的數值提取是多麼的複雜...

parseelement自己感覺是乙個比較失敗的方法, 所以從乙個普遍的角度來分析以下算術表示式的解析:

以(a + b) * c / d ** e + f * g為例

第一部分: 將中綴表示式(上面就是, 具體去查有關字首, 中綴, 字尾表示式)

這一步需要乙個棧用來儲存運算子, 乙個字串用來儲存輸出的字尾表示式

符號棧: signstack

字尾表示式: result

過程: 讀取表示式中每個元素(數字或運算子, 我的parseelement意在解決這個問題, 卻做的不成功)

原則:1. 運算元直接輸出到result

2. (直接進棧

3. )出棧直到遇到乙個"("(注意: 這裡"("必須出棧), 中間出棧的元素按出棧順序輸出到result

4. 其他運算子, 檢查棧頂元素, 如果棧頂比當前運算子優先順序高或相同(優先順序相同, 按順序執行)則先將棧頂出棧, 再入棧. 如果當前元素優先順序高, 則直接入棧.

操作過程的狀態變化

signstack |result |current char

( |a |a

( |ab |b

|ab+ |)

* |ab+c |c

/ |ab+c* |/

/ |ab+c*d |d

/, **|ab+c*d |**

/, **|ab+c*de |e

+|ab+c*de**/ |+

+|ab+c*de**/f |f

+, * |ab+c*de**/f |*

|ab+c*de**/fg*+ |g

唉, 不太美觀啊..

第二部分: 計算字尾表示式(ab+c*de**/fg*+)

這一步需要乙個棧用來儲存運算元

值棧過程: 讀取字尾表示式中每個元素

原則:1. 運算元直接進棧

2. 遇到乙個運算子則出棧兩個, 計算結果再進棧

操作過程的狀態變化

stack |current char

a |a

a, b |b

(a+b) |+

(a+b), c |c

(a+b)*c |*

((a+b)*c), d |d

((a+b)*c), d, e |e

((a+b)*c), (d**e) |**

(((a+b)*c)/(d**e))|/

(((a+b)*c)/(d**e)), f |f

(((a+b)*c)/(d**e)), f, g |g

(((a+b)*c)/(d**e)), (f*g) |*

((((a+b)*c)/(d**e))+(f*g)) |+

還是不很美觀哈, 呵呵, 逗號把元素隔開, 應該還是可以看的比較清晰了...呵呵..

利用棧解析算術表示式

在沒有接觸到棧這種資料結構時,一直覺得用程式計算四則表示式是件相當繁瑣的事。但利用棧,問題就立刻變得容易許多。解析任何包括 和0到9數字組成的算術表示式,並計算其結果。中綴表示式就是通常所說的算術表示式,比如 1 2 3 4。字尾表示式是指通過解析後,運算子在運算數之後的表示式,比如上式解析成字尾表...

棧 算術表示式

將乙個算術表示式 即中綴形式 轉化成其字尾形式,並算出答案。include include include include include include using namespace std using namespace std bool isoperator char ch return f...

解析算術表示式

現有字串形式的算術表示式,求計算其值。string str1 2000 600 3 300 2 string str2 2000 600.389895334 2 300 2 6 100 求解方法如下 讀取公式,返回結果。param express 算術公式 return 結果字串 保留兩位小數 pu...