如「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 輸...