我假設你的表示式樹是由許多物件組成的,它們的型別對應於它是什麼樣的表示式。例如,or,equals,strings等,類似於:class orexpression:
def __init__(self, left, right):
self.left = left
self.right = right
class equal***pression:
def __init__(self, left, right):
self.left = left
self.right = right
class literal:
def __init__(self, value):
self.value = value
class variable:
def __init__(self, name):
self.name = name
與示例等效的表示式如下所示:
^$您可以為每個為給定上下文計算自身的類建立乙個方法eval。是這樣的:class orexpression:
def __init__(self, left, right):
self.left = left
self.right = right
def eval(self, variables):
return self.left.eval(variables) or self.right.eval(variables)
class equal***pression:
def __init__(self, left, right):
self.left = left
self.right = right
def eval(self, variables):
return self.left.eval(variables) == self.right.eval(variables)
class literal:
def __init__(self, value):
self.value = value
def eval(self, variables):
return self.value
class variable:
def __init__(self, name):
self.name = name
def eval(self, variables):
return variables[self.name]
print e.eval()
print e.eval()
結果:true
true
false
但是,如果你不按型別區分不同的表示式呢?假設您的樹由普通的舊節點組成,這些節點標識它們使用的value屬性是什麼型別的表示式。**大致相同,只是使用乙個單片開關,而不是單獨的eval方法。在class node:
def __init__(self, value=none, *children):
self.value = value
self.children = children
def evaltree(t, variables):
if t.value == "or":
return evaltree(t.children[0], variables) or evaltree(t.children[1], variables)
elif t.value == "equals":
return evaltree(t.children[0], variables) == evaltree(t.children[1], variables)
elif t.value == "literal":
return t.children[0].value
elif t.value == "variable":
name = t.children[0].value
else:
raise exception("unrecognized node type")
t = node("or",
node("equals",
node("variable", node("element")),
node("or",
node("equals",
node("variable", node("element")),
node("equals",
node("variable", node("element")),
print evaltree(t,)
print evaltree(t,)
結果:true
true
false
從字尾表示式建立表示式樹
在乙個公司呆久了,不出去看看,你永遠不知道你的水平如何,你值多少錢。也就是說,作為乙個技術人員,應該每隔4 5個月,出去參加幾次面試,看看自己的技術水平有沒有和it圈脫節。但更多的是在尋找更好的機會,找乙份更適合自己,待遇更高的工作。好了,從今天起,每天都總結乙個小的資料結構與演算法知識,一來擴充自...
表示式 表示式樹 表示式求值
總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入輸入分...
Lambda表示式表示式樹
在c 3.0中,繼匿名方法之後出現了lambda 表示式,使表達更為簡潔 快捷。lambda 表示式使用lambda 運算子 來定義,語法如下 引數列表 lambda 運算子的左邊是輸入引數,定義lambda表示式的接收引數列表,右邊包含表示式或語句塊,表示將表示式的值或語句塊返回的值傳給左邊的引數...