棧應用之 后綴表達式計算 (python 版)


棧應用之 后綴表達式計算 (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) ."}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM