資料結構47 樹的應用 表示式解析(二)

2021-10-10 04:49:52 字數 2150 閱讀 7540

目錄

一、建立表示式解析樹:例項

二、利用表示式解析樹求值:思路

全括號表示式:(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 ...