資料結構與演算法 Python版 十 字尾表示式求值

2021-10-07 09:48:54 字數 1974 閱讀 5713

如「4 5 6 * +」, 我們先掃瞄到4、 5兩個運算元

但還不知道對這兩個運算元能做什麼計算, 需要繼續掃瞄後面的符號才能知道

繼續掃瞄, 又碰到運算元6

還是不能知道如何計算, 繼續暫存入棧

直到「*」, 現在知道是棧頂兩個運算元5、 6做乘法

我們彈出兩個運算元, 計算得到結果30,需要注意:先彈出的是右運算元,後彈出的是左運算元,這個對於-/很重要!

為了繼續後續的計算, 需要把這個中間結果30壓入棧頂

繼續掃瞄後面的符號

當所有操作符都處理完畢, 棧中只留下1個運算元, 就是表示式的值

如果單詞是乙個操作符(*/±),就開始求值,從棧頂彈出2個運算元,先彈出的是右運算元,後彈出的是左運算元,計算後將值重新壓入棧頂

def

postfixeval

(postfixexpr)

: operandstack = stack(

) tokenlist = postfixexpr.split(

)for token in tokenlist:

if token in

"0123456789"

: operandstack.push(

int(token)

)else

: operand2 =

str(operandstack.pop())

operand1 =

str(operandstack.pop())

result =

eval

(" "

.join(

[operand1, token, operand2]))

operandstack.push(result)

return operandstack.pop(

)print

(postfixeval(

"3 4 * 2 -"

))

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(

"3 4 * 2 -"

))

資料結構與演算法 遞迴演算法(Python版)

一 整數轉換為任意進製 我們用最熟悉的十進位制分析下這個問題 十進位制有十個不同符號 convstring 0123456789 比十小的整數 轉換成十進位制,直接查表 就可以 了 convstring n 想辦法把比十大的整數,拆成一系列比十小的整 數,逐個查表,比如七百六十九,拆成 七 六 九,...

MOOC資料結構與演算法Python版 第六周測驗

1 單選 2分 下列哪個演算法使用到了分治策略?d 2單選 2分 函式值快取最適合使用哪種python中的資料型別?b 3 單選 2分 已知數列g x 滿足 根據遞推式寫出求數列值的遞迴演算法,問原始演算法與採用函式值快取的演算法時間複雜度分別為多少?a 4 單選 2分 博物館大盜問題中,若共有10...

資料結構與演算法Python版學習筆記一

用input獲取輸入時,不能加提示符 多行輸入,每一行對應乙個input函式,根據題目要求的資料型別進行轉換 如果每行乙個整數,則可以寫入以下 a int input 單行輸入多個變數 以字串形式儲存 輸入兩個變數 a,b input split 輸入三個變數 a,b,c input split 輸...