中綴轉字尾,計算結果

2021-10-10 14:16:22 字數 2316 閱讀 7094

import queue

#判斷符號優先符

defcompareii

(a,b):if

(a==

'+'or a==

'-')

and(b==

'*'or b==

'/')

:return

0elif a==

'('or b==

'(':

return

0return

1#中綴變字尾

# 1)乙個數字棧

# 2)乙個符號棧

# 3)判斷符號的優先順序

# 4)數字棧跳到符號棧

# 5)輸出符號棧

defshow

(line)

: opstack =

rslist =

for i in line:

p =none

if i in

['0'

,'1'

,'2'

,'3'

,'4'

,'5'

,'6'

,'7'

,'8'

,'9']:

else:if

not opstack:

p = i

continue

else

: p = opstack[

len(opstack)-1

]if compareii(p,i)

:while opstack and compareii(p,i)

:if opstack:

p = opstack[

len(opstack)-1

] o = opstack.pop(

)if o!=

'('and o!=

')':

ifnot opstack:

else

:print

(rslist)

#計算結果

defcalculate

(line)

: opstack =

rslist =

for i in line:

p =none

if i in

['0'

,'1'

,'2'

,'3'

,'4'

,'5'

,'6'

,'7'

,'8'

,'9']:

else:if

not opstack:

p = i

continue

else

: p = opstack[

len(opstack)-1

]if compareii(p,i)

:while opstack and compareii(p,i)

:if opstack:

p = opstack[

len(opstack)-1

] o = opstack.pop(

)if o!=

'('and o!=

')':

if o==

'+'and rslist:

int(rslist.pop())

+int

(rslist.pop())

)elif o==

'-'and rslist:

a =int(rslist.pop())

b =int(rslist.pop())

elif o==

'*'and rslist:

int(rslist.pop())

*int

(rslist.pop())

)elif o==

'/'and rslist:

a =int(rslist.pop())

b =int(rslist.pop())

ifnot opstack:

else

:print

(rslist)

if __name__ ==

'__main__'

: line =

'(3+4)*5+7-(2+1)*9='

show(line)

calculate(line)

運算截圖:

C 中綴轉字尾 字尾轉換得出計算結果

對於簡單的四則運算而言,我們可以結合棧與字串結合,將中綴表示式轉化為字尾表示式,然後將字尾表示式轉化得出計算結果。將中綴表示式轉化為字尾表示式 棧用來進出 運算的符號 將字尾表示式進行運算得出結果 棧用來進出 運算的數字 將中綴表示式轉化乘字尾表示式 設定 優先順序 讀取輸入佇列的字元,判斷是數字還...

資料結構之棧實現中綴轉字尾並計算結果

給定乙個中綴,最後變為字尾的過程其實並不算複雜,下面分析一下過程 1.首先面對乙個中綴表示式,我們需要兩個棧,乙個用來存放運算子,即符號棧 operatorstack,乙個用來存放數字,運算子,即數字棧 numstack 2.開始掃瞄中綴表示式 3.遇到運算元時,我們直接壓入數字棧,即numstac...

中綴表示式轉字尾表示式並輸出計算結果

字尾表示式又稱逆波蘭表示式,明顯的特點是 逆波蘭表示式中沒有括號,計算時將操作符之前的第乙個數作為右運算元,第二個數作為左運算元,進行計算,得到的值繼續放入逆波蘭表示式中。但日常生活中我們總是習慣於寫中綴表示式,所以需要先將中綴表示式轉為字尾表示式。假如中綴表示式為 12 3 4 6 8 2 在遇到...