python前缀表达式求值_python数据结构与算法 11 后缀表达式求值
從本節(jié)開(kāi)始,刪除原版的英文,直接發(fā)譯后的文稿。
后綴表達(dá)式求值
棧的最一個(gè)應(yīng)用例子,計(jì)算一個(gè)后綴表達(dá)式的值。這個(gè)例子中仍然用棧的數(shù)據(jù)結(jié)構(gòu)。不過(guò),當(dāng)掃描表達(dá)式的時(shí)候,這次是操作數(shù)壓棧等待,不是轉(zhuǎn)換算法中那樣讓操作符等待。另一條思路是,無(wú)論何時(shí)看到輸入一個(gè)操作符,最近的兩個(gè)操作數(shù)就是操作對(duì)象。
為了說(shuō)清楚一點(diǎn),考慮表達(dá)式4 5 6 * +。從左到右掃描時(shí),首先得到4和5,不過(guò)此時(shí),并不知道怎樣處理這兩個(gè)數(shù),直到看到后面的操作符。所以要把這兩個(gè)數(shù)先壓棧,得到操作符以后再出棧。
這個(gè)例子中,下一個(gè)符號(hào)仍然是操作數(shù),所以照舊壓棧,并檢查下一個(gè)?,F(xiàn)在看到操作符*,這意味著最近兩個(gè)操作數(shù)要用來(lái)做乘法。出棧兩次,得到兩個(gè)操作數(shù)并相乘(在本例中是結(jié)果是30)
這個(gè)計(jì)算結(jié)果要壓回到棧內(nèi),并作為下一個(gè)操作符的對(duì)象。當(dāng)最后一個(gè)操作符工作結(jié)束,棧內(nèi)應(yīng)該只有一個(gè)數(shù)值,出棧并作為計(jì)算結(jié)果返回。圖10顯示了這個(gè)求值過(guò)程中,棧內(nèi)容的變化。
圖11顯示了一個(gè)稍微復(fù)雜的表達(dá)式求值過(guò)程。7 8 + 3 2 + /。這個(gè)例子中有兩點(diǎn)要注意。第一,棧的大小,隨著子表達(dá)式的計(jì)算過(guò)程而膨脹,收縮,再膨脹。第二,除法操作符要小心處理,因?yàn)楹缶Y表達(dá)式的操作數(shù)順序不變,但當(dāng)兩個(gè)操作數(shù)出棧時(shí),順序反了。因?yàn)槌ú恢С纸粨Q律,所以15/5與5/15不同,必須保證順序沒(méi)有交錯(cuò)。
算法假定后綴表達(dá)式是一系列被空格分隔的字符,操作符是* /+ -,操作數(shù)假定是一位整數(shù)。最終結(jié)果也是整數(shù)。
1
建立一個(gè)空棧,operandStack
2
字符串使用split轉(zhuǎn)為列表
3
從左到右檢索列表
如果是操作數(shù),字符轉(zhuǎn)為整數(shù),壓棧
如果是操作符,出棧兩次。第一次出棧的是第二個(gè)操作數(shù),第二次出棧的是第一個(gè)操作數(shù)。計(jì)算結(jié)果,并壓回棧。
4
檢索結(jié)束,出棧結(jié)果就是返回值。
完整的函數(shù)代碼如下,其中的doMath是算法輔助函數(shù),定義為兩個(gè)操作數(shù)和一個(gè)操作符的計(jì)算。
from pythonds.basic.stack import Stack
def postfixEval(postfixExpr):
operandStack = Stack()
tokenList =postfixExpr.split()
for token in tokenList:
if token in"0123456789":
operandStack.push(int(token))
else:
operand2 =operandStack.pop()
operand1 =operandStack.pop()
result =doMath(token,operand1,operand2)
operandStack.push(result)
return operandStack.pop()
def doMath(op, op1, op2):
if op == "*":
return op1 * op2
elif op == "/":
return op1 / op2
elif op == "+":
return op1 + op2
else:
return op1 - op2
print(postfixEval(‘7 8 + 3 2 + /‘))
原文:http://blog.csdn.net/python2014/article/details/21342223
總結(jié)
以上是生活随笔為你收集整理的python前缀表达式求值_python数据结构与算法 11 后缀表达式求值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql通用查询日志_MySQL通用查
- 下一篇: python答案公众号_大学慕课用Pyt