棧應用之 后綴表達式計算 (python 版)
后綴表達式特別適合計算機處理
1. 中綴表達式、前綴表達式、后綴表達式區別
中綴表達式:(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 +
2. 算法核心
假定 st 是一個棧 (棧的特點:后進先出 LIFO)
比如 【3 / 5】 即 【3 5 / 】;
3 先壓入棧,而后 5 出棧;
元素在棧里面的順序應該是 【5,3】;
5 先出棧,而后 3 出棧。
所以第二個運算對象先出棧,第一個運算對象后出棧。
1 # 擴充棧的方法 計算棧元素個數 2 class ESStack(SStack): 3 """docstring for ESS""" 4 def depth(self): 5 return len(self._elems)
1 def auf_exp_evaluator(exp): 2 operatora = '+-*/' 3 st = ESStack() # 擴充功能的棧,可用depth()檢查元素個數 4 5 for x in exp: 6 if x not in operatora: 7 st.push(flaot(x)) 8 continue # 跳過本次for循環 9 10 if st.depth() < 2 : 11 raise SyntaxError{"Short of operand(s)"} 12 a = st.pop() # 取出第二個運算對象 13 b = st.pop() # 取出第一個運算對象 14 15 if x == "+" : 16 c = b + a 17 elif x == "-": 18 c = b - a 19 elif x == "*" : 20 c = b * a 21 elif x == "/" : # 這里可能引發異常 ZeroDivisionError 22 c = b / a 23 else : 24 break # 這一步不可能出現,只是為了方便看、理解 25 26 st.push(c) # 將本次運算結果壓入棧 27 28 if st.depth() == 1 # 如果棧里面只有一個元素,表示計算完成 29 return st.pop() 30 raise SyntaxError{"Extra operand(s) ."}
