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)
運算截圖:![](https://pic.w3help.cc/ee7/97f80cc4f703f7bc0e4937911cf12.jpeg)
C 中綴轉字尾 字尾轉換得出計算結果
對於簡單的四則運算而言,我們可以結合棧與字串結合,將中綴表示式轉化為字尾表示式,然後將字尾表示式轉化得出計算結果。將中綴表示式轉化為字尾表示式 棧用來進出 運算的符號 將字尾表示式進行運算得出結果 棧用來進出 運算的數字 將中綴表示式轉化乘字尾表示式 設定 優先順序 讀取輸入佇列的字元,判斷是數字還...
資料結構之棧實現中綴轉字尾並計算結果
給定乙個中綴,最後變為字尾的過程其實並不算複雜,下面分析一下過程 1.首先面對乙個中綴表示式,我們需要兩個棧,乙個用來存放運算子,即符號棧 operatorstack,乙個用來存放數字,運算子,即數字棧 numstack 2.開始掃瞄中綴表示式 3.遇到運算元時,我們直接壓入數字棧,即numstac...
中綴表示式轉字尾表示式並輸出計算結果
字尾表示式又稱逆波蘭表示式,明顯的特點是 逆波蘭表示式中沒有括號,計算時將操作符之前的第乙個數作為右運算元,第二個數作為左運算元,進行計算,得到的值繼續放入逆波蘭表示式中。但日常生活中我們總是習慣於寫中綴表示式,所以需要先將中綴表示式轉為字尾表示式。假如中綴表示式為 12 3 4 6 8 2 在遇到...