字尾表示式特別適合計算機處理
中綴表示式:(3 - 5) * (6 + 17 * 4) / 3 17 * 4 + 6字首表示式:/ * - 3 5 + 6 * 17 4 3 * 17 4 + 6字尾表示式:3 5 - 6 17 4 * + * 3 / 17 4 * 6 +
假定 st 是乙個棧 (棧的特點:後進先出 lifo)
比如 【3 / 5】 即 【3 5 / 】;
3 先壓入棧,而後 5 出棧;
元素在棧裡面的順序應該是 【5,3】;
5 先出棧,而後 3 出棧。
所以第二個運算物件先出棧,第一個運算物件後出棧。
1#擴充棧的方法 計算棧元素個數
2class
esstack(sstack):
3"""
docstring for ess
"""4
defdepth(self):
5return len(self._elems)
1defauf_exp_evaluator(exp):
2 operatora = '
+-*/
'3 st = esstack() #
擴充功能的棧,可用depth()檢查元素個數45
for x in
exp:
6if x not
inoperatora:
7st.push(flaot(x))
8continue
#跳過本次for迴圈910
if st.depth() < 2:
11raise syntaxerror
12 a = st.pop() #
取出第二個運算物件
13 b = st.pop() #
取出第乙個運算物件
1415
if x == "+"
:16 c = b +a
17elif x == "-"
:18 c = b -a
19elif x == "*"
:20 c = b *a
21elif x == "
/" : #
這裡可能引發異常 zerodivisionerror
22 c = b /a
23else:24
break
#這一步不可能出現,只是為了方便看、理解
2526 st.push(c) #
將本次運算結果壓入棧
2728
if st.depth() == 1 #
如果棧裡面只有乙個元素,表示計算完成
29return
st.pop()
30raise syntaxerror
棧的應用之後綴表示式求值
字尾表示式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則 我們數學上採用的表示式叫中綴表示式,即將運算放在兩個運算物件中間。此外還有字尾表示式,即將運算子放在兩個運算物件的前面。下面是同乙個算術表示式的三種等價表示形式 中綴...
棧的應用之後綴表示式的求解
在小學的運算中,我們經常接觸到的數學表示式,它的規則也就是老生常談的了 先乘除,後加減,從左到右,先括號後括號外 但後來出現的四則運算,則要求優先順序,計算更加複雜,而計算機解決這種問題的方法就是利用棧,這就引入了字尾表示式 字尾表示式的基本概念 字尾表示式也叫逆波蘭表示式,是一種不需要括號的字尾表...
棧結構之後綴表示式
棧採用順序棧儲存,試設計演算法實現將表示式轉換成字尾表示式輸出。例如,輸入表示式 a b c d e f g 輸出其字尾表示式 abc de f g include include define true 1 define false 0 define ok 1 define error 0 def...