大家都知道,表示式樹前序遍歷得到字首表示式,中序遍歷得到中綴表示式,後序遍歷得到字尾表示式,
那麼,如何根據最常見的中綴表示式畫出表示式的樹形結構圖呢?
步驟1:求出中綴表示式對應的字尾表示式
步驟2:根據字尾表示式畫圖
我們一次乙個符號地讀入字尾表示式。如果符號是運算元,那麼就建立乙個單結點樹並將它的指標推入棧中。如果符號是操作符,那麼就從棧中彈出兩棵樹t1和t2(假設t1先彈出)並形成一棵新的樹,該樹的根就是操作符,它的左、右兒子分別是t2和t1。然後將指向這顆樹的指標壓入棧中。
下面來看乙個例子。設轉換後的字尾表示式輸入為ab+cde+**
前兩個符號是運算元,因此建立兩棵單結點樹並將指向它們的指標壓入棧中。
接著,"+"被讀入,因此指向兩棵樹的指標被彈出,形成一棵新的樹,並將指向它的指標壓入棧中。
然後,c,d和e被讀入,在單個結點樹建立後,指向對應的樹的指標被壓入棧中。
接下來讀入"+"號,因此兩棵樹合併。
繼續進行,讀入"*"號,因此,彈出兩棵樹的指標合併形成一棵新的樹,"*"號是它的根。
最後,讀入乙個符號,兩棵樹合併,而指向最後的樹的指標被留在棧中。
給出乙個表示式,求取表示式的值
include include include include include using namespace std 思路 1.字串預處理,針對可能出現的 等特殊情況進行替換,判斷 是負號還是減號,負號前面 0,轉變成減法運算 2.將中綴字串轉變為字尾字串陣列 3.對字尾字串陣列進行求解 int ...
C Lamda表示式的乙個妙用
在專案程式設計中,經常會遇到類似這樣的需求 當verbosity設定大於等於1時,開啟debug列印 否則關閉列印。以下是一種常見的實現方法,因為log可能需要進行一些拼接或者計算,故在乙個print log函式中實現。但這樣做有乙個問題,即使m verbosity配置為0,print log 這個...
基於Linq表示式做的乙個簡單的表示式生成器
using system using system.collections.generic using system.componentmodel.dataannotations.schema using system.linq using system.linq.expressions names...