表示式求值的另外一種實現方式 表示式樹

2022-06-12 14:57:08 字數 791 閱讀 6952

計算器求值的常規解法是使用棧分別儲存運算元和操作符,具體**如下

//

這裡是開頭

//這裡是結尾

棧求解表示式

這種結構的實現可以滿足一定複雜度的運算子,我們剛剛接觸棧的時候都會自己實現以下這種表示式的運算方式。

本篇部落格要介紹的是另外一種實現這種表示式計算的方法----使用表示式樹

首先來介紹以下什麼是表示式樹:

表示式樹是一棵樹,他是對乙個字串形式的表示式的樹形表示。圖1是乙個表示式樹的例子(來自網路),從上可以看出,表示式的樹形表示很容易計算結果,一棵表示式樹的結果可以使用遞迴的方法很方便的求解出,看求解函式:

private

double getvalue(node root) throws

exception

}

求解表示式樹的結果

有上述**可以看出,對於表示式樹的求解可以說是很容易,程式容易寫也容易理解。那麼如何生成一棵表示式樹呢?這是本篇部落格的重點內容。

首先來看一下對於這個表示式,如何生成表示式樹:2+3-4-1+5 這個表示式只含有+和-兩種操作,程式操作流程如下:

1,讀取乙個數 2

2,讀取乙個操作符 +,將該數作為該操作符的左元素,如果讀取不到退出

3,讀取乙個運算元 3,將該數作為該操作符的右運算元。

4,將該運算元節點作為乙個數,回到2

經過以上操作,可以達到一棵表示式樹:

現在我們考慮*/的情況,相比+-,*/是一種優先順序更高的運算元 ::2+3*4-1+5

表示式求值的另一種方法

表示式求值除了用文法實現之外,還可以直接用棧,將中綴表示式轉化為字尾表示式。然後再用求表示式的值就輕而易舉了。下面貼程式原始碼 可能有點長,呵呵 main.cpp include stack.cpp include stack.h includeusing namespace std 該函式有兩個功...

表示式求值的實現

表示式求值是乙個很有意思的技術話題,國內外討論這個話題的技術人員很多,也有非常多的實現方案。倒不是說這個問題很難解決,只是說它提供了很好的話題,讓各路高手使用自己的手段來解決問題,百家爭鳴,各展所長。該話題也提供了乙個非常好的想像空間讓大家一起討論技術討論方案,也是乙個資料結構教程中的經典教育案例。...

表示式求值的java實現

對整數表示式求值.表示式中可能包含 四則運算,以及括號,比如 4 2 3 10 5,1 2 4 5 9 7 等.思路 將括號之間的內容當做子表示式求值,得出子表示式的結果後就可以去掉括號了.使用optr棧儲存運算子,opnd棧儲存運算元.解析表示式,如果得到運算元就存入opnd棧中,如果得到運算子,...