用到了棧,并且遞歸實(shí)現了中序遍歷,后序遍歷,前序遍歷。
同時(shí)應該學(xué)會(huì )union的使用方法。
基礎知識:
一、表達式樹(shù)
表達式樹(shù)的樹(shù)葉是操作數(operand),加常數或變量名字,而其他的結點(diǎn)為操作數(operator)。由于這里所有的操作都是二元的,因此這棵特定的樹(shù)正好是二叉樹(shù),雖然這是最簡(jiǎn)單的情況,但是結點(diǎn)還是有可能含有多于兩個(gè)的兒子,這里我們不討論。
二、構造一棵表達式樹(shù)
之前我們實(shí)現過(guò)一個(gè)中綴表達式求值的具體程序,在求值過(guò)程中需要用兩個(gè)棧,并且代碼并不簡(jiǎn)單。而這里你會(huì )看到,對于表達式樹(shù)的求值操作卻非常簡(jiǎn)單,甚至只需要兩條語(yǔ)句。因為這里大部分操作都是遞歸定義,二遞歸函數本身都是很簡(jiǎn)潔的,甚至比你想象的還要簡(jiǎn)單,甚至只需要兩條語(yǔ)句。因為這里大部分操作都是遞歸定義,二遞歸函數本身都是很簡(jiǎn)潔的,甚至比你想象的還要簡(jiǎn)單!就像樹(shù)的遍歷操作。三種遍歷分別是先序遍歷、中序遍歷與后序遍歷,正好對應表達式的三種形式:前綴型、中綴型與后綴型。其中為大家熟知的是中綴形式,如2+3*(5-4)。前綴型表達式又叫波蘭式(Polish Notation),后綴性表達式又叫逆波蘭式(Reverse Polish Notation)。他們最早于1920年波蘭數學(xué)家Jan Lukasiewicz發(fā)明,這兩種表示方式的最大特點(diǎn)是不需要括號來(lái)表明優(yōu)先級,他們經(jīng)常用于計算機科學(xué),特別是編譯器設計方面。
下面給出一種算法來(lái)把后綴表達式轉變成表達式樹(shù)。我們一次一個(gè)符號地讀入表達式。如果符號是操作數,那么就建立一個(gè)單結點(diǎn)樹(shù)并將它推入棧中。如果符號是操作符,那么就從棧中彈出兩棵樹(shù)T1和T2(T1先彈出)并形成一棵新的樹(shù),該樹(shù)的根就是操作符,它的左、右兒子分別是T2和T1。然后將指向這顆樹(shù)的指針壓入棧中。
下面來(lái)看一個(gè)例子。設輸入為ab+cde+**
前兩個(gè)符號是操作數,因此創(chuàng )建兩棵單結點(diǎn)樹(shù)并將指向它們的指針壓入棧中。
接著(zhù),"+"被讀入,因此指向兩棵樹(shù)的指針被彈出,形成一棵新的樹(shù),并將指向它的指針壓入棧中。
然后,c,d和e被讀入,在單個(gè)結點(diǎn)樹(shù)創(chuàng )建后,指向對應的樹(shù)的指針被壓入棧中。
接下來(lái)讀入"+"號,因此兩棵樹(shù)合并。
繼續進(jìn)行,讀入"*"號,因此,彈出兩棵樹(shù)的指針合并形成一棵新的樹(shù),"*"號是它的根。
最后,讀入一個(gè)符號,兩棵樹(shù)合并,而指向最后的樹(shù)的指針被留在棧中。
測試結果如下:
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。