日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

發(fā)布時(shí)間:2025/4/5 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python前缀表达式求值_python数据结构与算法 11 后缀表达式求值 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

從本節(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。