對於四則運算表示式,中綴表示式是方便人類讀懂的書寫方式,而要轉化為計算機方便計算的形式必須將其轉換為字首或者字尾表示式。
本文利用棧結構簡單數學四則運算表示式的計算,其中僅考慮四則運算和( ),同時不考慮錯誤表示式的排查。
def
rpn_express
(m):
""" 構造乙個數字棧和乙個符號棧,符號棧在如下情況下彈出壓入數字棧:
(1)遇到')',將'('之間的四則符號彈出
(2)每乙個四則符號壓入前,符號棧內等級更高的符號需彈出
@param: m 數學表示式中綴字串
@return: 數學表示式字尾字串
"""weights =
number_stack =
symbol_stack =
for i in m:
if i in
'0123456789'
:# 壓入數字棧
elif i ==
'(':
elif i in weights:
while symbol_stack and weights[symbol_stack[-1
]]>= weights[i]
:# 若符號棧為非空))
elif i ==
')':
while symbol_stack and symbol_stack[-1
]!='(':))
else
: symbol_stack.pop(
)while symbol_stack:))
return
' '.join(number_stack)
defrpn_calculate
(m):
""" 構造乙個數字棧和乙個符號棧,數字和符號分別壓入其中。按照如下計算規則:
(1)當取得符號,且數字棧倒數兩個為數字時,彈出這兩個數字,將三者計算,並將結果壓入數字棧內
(2)當取得符號,且數字長度不足2時,壓入符號棧
(3)最後檢查符號棧和數字棧,若符號棧仍有多餘,一次進行彈出兩個數字+乙個字元的計算,再將結果壓入數字棧
@param: m 數學表示式字尾字串
@return: 計算結果
"""number_stack =
symbol_stack =
for i in m.split():
if i in
'0123456789'
:elif i in
'+-*/':if
len(number_stack)
>=2:
tmp = math_op(number_stack.pop(
), number_stack.pop(
), i)
else
:while symbol_stack:
tmp = math_op(number_stack.pop(
), number_stack.pop(
), symbol_stack.pop())
assert
len(number_stack)==1
return number_stack[0]
if __name__ ==
'__main__'
: string =
'(1-4*7+3*(6/3+1))/2'
print
(rpn_express(string)
)print
(rpn_calculate(rpn_express(string)
))
字尾表示式 棧
若干行,每行對應乙個中綴表示式 若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式 x a y b z f a b c d m n s t y a b c d e f gxayb zf abc dm n st y abc def g 解題思路 首先如何實現中綴表示式轉換成字尾表示式,方法如下 1....
棧 字尾表示式
看了老師給的部落格,學習了一下,我學的確實很菜啊,仿照寫了乙個可以實現任意數字個數的加括號運算,目前只支援加乙個括號。收穫真的挺大 def to rpn f4 defcompare x,y v return 1 if y else v x v y rpn,operators for i in f4 ...
使用棧完成中綴表示式轉字尾表示式
字尾表示式也稱為逆波蘭表示式。求字尾表示式的過程有很多種,這裡給出利用棧實現的過程。現代編譯器不會直接將算術表示式轉化成機器層的 而是使用乙個中間形式,成為字尾表達法。在字尾表示式中,運算子緊隨在它的運算元的後面,例如,給出中綴表示式a b它的字尾形式就是ab 對於a b c,字尾形式就是abc 說...