表示式計算演算法總結

2021-05-07 12:22:11 字數 1294 閱讀 9673

表示式計算演算法總結

一,使用雙棧

乙個運算元棧optr,乙個操作符棧opnd.

思想是:置運算元棧為空,操作符棧壓入元素"#"(它具有最高優先順序),依次讀入表示式中的每個字 符w

if(w為運算元)

else

} 重複上述操作直到表示式處理完畢。

最後運算元棧剩餘的運算元就是計算的最終結果。

二,使用二叉樹

流程:將表示式(中綴)轉化為二叉樹,後序遍歷該二叉樹得到表示式的逆波蘭表示式(字尾),計算

該逆波蘭表示式

其中將中綴表示式轉化為二叉樹的演算法是:

設表示式類express,樹類tree, 由makenode(value)來生成值為value左右孩子為空的節點

void m(express exp, tree t)

else if(exp 形如"ex1 op ex2")//即op為二元操作符

else if( exp 形如"ex1 op")//比如5!

} 後序遍歷二叉樹的演算法是:

void f(tree t)

f(t.leftchild);

f(t.rightchild);

visit(t);//訪問t }

計算逆波蘭表示式的演算法:

設表示式記號tkn;運算元棧stk;

while( (tkn=getnexttoken()) != null)

else if(tkn == 操作符)

} 最後stk中剩餘的運算元就是計算結果。

三,我原創的方法:利用編譯器

我們對表示式的計算將擺脫傳統的觀點(即傳統的對表示式進行詞法分析,語法分析等等),在編

寫我們的計算器的**中,不會有任何的詞法分析、語法分析、字尾表示式轉換等等。

啟發來自於這裡:

假設有乙個函式f

double f()

那麼,我們就可以 console.writeline("",f());    

我們計算了3*4.5+sin(50),但我們有進行麻煩的詞法分析與語法分析嗎?沒有,誰幫我們做了,

編譯器,ok,關鍵就在這:如果計算器使用者在計算器主視窗上輸入表示式

3*4.5+sin(50),我們負責把它傳給f中的r,然後我們再把f的返回值輸出到使用者介面上就ok了,我們

要做的就這些。

詳細的演算法可以到我的部落格 http://zhouyinhui.cnblogs.com/  參看「

用.net打造可程式設計的表示式計算器「一文。

使用棧來計算算術表示式

之所以寫這個,是因為最近在學習c 的過程中,c primer 第五版 9.6的習題跟這個有關,在網上看看些人的思路,也就做出來了,正好寫到部落格裡面。原題如下 使用 stack 處理括號化的表示式。當你看到乙個左括號,將其記錄下來。當你在乙個左括號之後看到乙個右括號,從 stack 中 pop 物件...

演算法訓練 表示式計算

上網查了一下,採用字尾表示式 從中序表示式 轉換為 後序表示式 由於後續表示式更易計算機去解決,所以我們在運算算術表示式時要先轉換為後序的。方法如下 建立符號棧 順序掃瞄中序表示式 a 是數字,直接輸出 b 是運算子 i 直接入棧 ii 將符號棧中的元素依次出棧並輸出,直到 只出棧,不輸出 iii ...

演算法訓練 表示式計算

演算法訓練 表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過10...