演算法 表示式求值

2021-09-06 23:31:08 字數 1100 閱讀 7749

今天在網上看到dijkstra的雙棧算術表示式求值演算法,以前很早的時候知道通過算術棧和數值棧搞定的,這次用oc通過陣列實現了預期的效果.

(原理參考網上,原作者不詳)

程式語言系統一般都內建了對算術表示式的處理,我們可以簡易的模仿一下算術表示式處理機制,思想不變,主要是實現方式略有不同。

算術表示式可能是乙個數、或者是由乙個左括號、乙個算術表示式、乙個運算子、另乙個算術表示式和乙個右括號組成的表示式。為了簡化問題,這裡定義的是未省略括號的算術表示式,它明確地說明了所有運算子的運算元,形式如下:

(1+((2+3)*(4*5)))

思路:

表示式由括號、運算子和運算元構成,我們根據以下4中情況從左至右逐個將這些實體送入棧處理:

1.將運算元壓入運算元棧;

2.將運算子壓入運算子棧;

3.忽略左括號;

4.在遇到右括號時,彈出乙個運算子,彈出所需數量的運算元,並將運算後的結果壓入運算元棧;

在處理完最後乙個右括號時,運算元棧上只會剩下乙個值,它就是表示式的計算結果。這種方法咋一看難理解,但要證明它能計算得到正確的值很簡單:

每當演算法遇到乙個括號包圍,並由乙個運算子和兩個運算元組成的子式時,他都將運算子和運算元運算結果壓入運算元棧。這樣的結果就像是在輸入中用這個值代替了該子表示式,因此用這個值代替子表示式得到的結果和原表示式相同。我們可以反覆應用這個規律並得到乙個最終值。

例如:(1+((2+3)*(4*5)))

(1+(5*(4*5)))

(1+(5*20))

(1+100)

101oc**實現如下:

-(nsinteger)operationexpression:(nsstring *)expression{

nsmutablearray *operationarr=[[nsmutablearray alloc]initwithcapacity:1];

nsmutablearray *valarr=[[nsmutablearray alloc]initwithcapacity:1];

for (nsinteger i=0; i還有很多缺憾,比如不能處理浮點數,不能處理,不能處理超過兩位數的整數,如果有想法的可以繼續優化一下~

表示式求值(遞迴演算法)

問題描述 見下圖 程式 題目描述 表示式求值 遞迴演算法 表示式 1 可以是乙個項 2 也可以由多個項通過加減構成 項 1 項本身可以是乙個因子 2 項也可以由若干個因子通過乘除組成 因子 1 因子本身可以是乙個數字 2 因子也可以由表示式加上括號組成 include include include...

表示式求值相關演算法

實現對乙個數學表示式的求值,例如 1 2 3 4 這個表示式的值為15 這個問題主要要分為如下幾個步驟 語法分析 將字串表示式轉化為數字和操作符的 token 陣列,1 2 3 4 轉逆波蘭表示式 將中綴表示式轉字尾表示式,1 2 3 4 逆波蘭表示式求值 15 逆波蘭表示式轉二叉樹 條件表示式中,...

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...