zoukankan      html  css  js  c++  java
  • 栈应用之 后缀表达式计算 (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) ."}
  • 相关阅读:
    Java中的几种常用循环 for switch while dowhile
    HTML的各种基本标签
    2017年终总结
    HTML C# ajax结合ashx处理程序实现文件上传
    HTML div鼠标悬停控制子控件显示与隐藏
    HTML 使用CSS 如何去掉文本聚焦框
    HTML input 文本框如何添加提示信息
    CSS 如何通过top left 定位控制div在另一个div的位置
    CSS background 属性
    php支付接口开发-支付宝-开发前期准备
  • 原文地址:https://www.cnblogs.com/zlsgh/p/9542066.html
Copyright © 2011-2022 走看看