目錄
一、建立表示式解析樹:例項
二、利用表示式解析樹求值:思路
全括號表示式:(3+(4*5))
從圖示過程我們可以看到,建立樹過程中關鍵的是對當前節點的跟蹤:
我們可以用乙個棧來記錄跟蹤父節點:
建立表示式解析樹**:
def buildparsetree(fpexp):
fplist = fpexp.split()
pstack = stack() # 建立空棧
etree = binarytree('') # 建立二叉樹
pstack.push(etree) # 入棧下降
currenttree = etree
for i in fplist:
if i == '(': # 表示式開始
currenttree.insertleft('')
pstack.push(currenttree) # 入棧下降
currenttree = currenttree.getleftchild()
elif i not in ['+', '-', '*', '/', ')']: # 運算元
currenttree.setrootval(int(i))
parnt = pstack.pop() # 出棧上公升
currenttree = parnt
elif i in ['+', '-', '*', '/']: # 操作符
currenttree.setrootval(i)
currenttree.insertleft('')
pstack.push(currenttree)
currenttree = currenttree.getrightchild()
elif i == ')': # 表示式結束
currenttree = pstack.pop() # 出棧上公升
else:
raise valueerror
return etree
建立了表示式解析樹,可以用來進行求值。
由於二叉樹binarytree是是乙個遞迴資料結構,自然可以用遞迴演算法來進行處理。
求值遞迴函式evaluate,由前面對子表示式的描述,可從樹的底層子樹開始,逐步向上求值,最終得到整個表示式的值。
求值函式evaluate的遞迴三要素:
基本結束條件:葉節點是最簡單的子樹,沒有左右節點,其根節點的資料項即為子表示式樹的值。
縮小規模:將表示式分為左子樹右子樹,即為縮小規模。
呼叫自身:分別呼叫evaluate計算左子樹和右子樹的值,然後將左子樹和右子樹的值按照根節點的操作符進行計算,從而得到表示式的值。
利用表示式解析樹求值**:
import operator
def evaluate(parsetree):
opers =
leftc = parsetree.getleftchild()
rightc = parsetree.getrightchild()
if leftc and rightc:
fn = opers[parsetree.getrootval()]
return fn(evaluate(leftc), evaluate(rightc))
else:
parsetree.getrootval()
資料結構表示式
35,15,80,70,20,字尾表達方式 35 15 80 70 20 25 中綴表達方式 35,15,80,70,20 字首表達方式 人的思維方式很容易固定 正如習慣拉10進製。就對2,3,4,8,16 等進製不知所措一樣 人們習慣的運算方式是中綴表示式。而碰到字首,字尾方式。迷茫 其實僅僅是一...
資料結構 棧應用之逆波蘭表示式(字尾表示式)
逆波蘭表示式含義我就不做贅述了,摘自百科上的一段話 逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為...
資料結構 表示式計算
表示式求值時資料結構的基礎演算法之一,其主要思想就是堆疊的使用。下面將詳細的介紹演算法的各個部分 表示式求值演算法主要流程如下 首先要說明的是字尾表示式,字尾表示式即 不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 ...