**中採用了三步實現算術表示式的解析:
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...