• 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值


    83f959769c74481db353627bf150c8f5.gif

    🌈write in front🌈
    🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
    🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
    📝个人主页Aileen_0v0🧸—CSDN博客
    🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
    📣系列专栏:Aileen_0v0🧸的PYTHON学习系列专栏——CSDN博客
    🗼我的格言:"没有罗马,那就自己创造罗马~" 

    6a78491801a74bbd8d932659b06e11db.gif#pic_center

    目录

     回顾

    后缀表达式运算过程

    后缀表达式求值思路及代码流程



    6a78491801a74bbd8d932659b06e11db.gif#pic_center

     回顾💫

    之前我们学习了栈的应用之前,后缀表达式的转换,如有遗忘,点击👉🔗http://t.csdnimg.cn/PodbC

    今天我们来学习-后缀表达式求值 问题

    跟中缀转换为后缀问题不同

    对后缀表达式来说 ,从左到右扫描的过程中,

    由于操作符在操作数后面,

    所以要暂存操作数,在碰到操作符时,再将两个暂存操作数进行实际计算

    这个过程利用的就是栈的特性:操作符只作用于离他最近的两个操作数.


    后缀表达式运算过程🍁


    后缀表达式,又称逆波兰式,不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),非常方便计算机的计算。

    后缀表达式的计算过程如下:
    1️⃣从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈
    2️⃣重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果

    计算后缀表达式的动态流程如下,以1+2-3*2的后缀表达式为例:

    e7c3f45dd84d4c728ddf9d71be1724ac.gif

    最后得到的结果 - 3 还要 push 回栈顶


    后缀表达式求值思路及代码流程🍂

    1.首先创建空栈operandStack 用于 暂存操作数

    2.将后缀表达式 用split方法解析为单词(token) 的列表

    3.从左到右扫描单词列表

       如果单词是一个操作数,将单词转换为整型int,压入operandStack 栈顶

       如果单词是一个操作符 (* / + - ) , 就开始求值, 从 栈顶弹出2个操作数,先弹出的是右操作数,     后弹出的是左操作数,计算后将值重新压入栈顶.

    4.单词列表扫描结束后,表达式的值就在栈顶

    5.弹出栈顶的值,返回.

    1. class Stack:#Stack---->ADT
    2. def __init__(self):
    3. self.items =[]
    4. def isEmpty(self):
    5. return self.items == []
    6. # 满足这些属性(行为)的是栈
    7. def push(self,item):
    8. self.items.append(item)
    9. def pop(self):
    10. return self.items.pop()
    11. def peek(self):
    12. return self.items[len(self.items)-1]
    13. #
    14. def size(self):
    15. return len(self.items)
    16. def postfixEval(postfixExpr):
    17. operandStack = Stack()
    18. tokenList = postfixExpr.split()
    19. for token in tokenList:
    20. if token in "0123456789":
    21. operandStack.push(int(token))
    22. else:
    23. operand2 = operandStack.pop()
    24. operand1 = operandStack.pop()
    25. result = doMath(token,operand1,operand2)
    26. operandStack.push(result)
    27. return operandStack.pop()
    28. def doMath(op, op1, op2):
    29. if op == "*":
    30. return op1 * op2
    31. elif op == "/":
    32. return op1 / op2
    33. elif op == "+":
    34. return op1 + op2
    35. else:
    36. return op1 - op2

    通过调用得到的运行结果: 

    88031539b016424da59629f1171b7ad8.png

    format,png51e8a5b2a2e04443ab42faf31f4b5f7b.gif

  • 相关阅读:
    Bootstrap Blazor 实战 Menu 导航菜单使用(2)
    Linux下普通用户(非root用户)安装Java,Java程序能编译不能运行的原因
    【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
    【音频处理】Loudness Normalization 响度均衡算法简介
    ubuntu的命令&操作
    探索 Chrome 插件开发之旅
    【C++】一文解析std::binary_function、std::bind1st、std::bind2nd、std::bind
    第6章 Elasticsearch,分布式搜索引擎
    mac 本地运行 http-proxy-middleware ,请求超时
    【算法】矩阵快速幂优化动态规划
  • 原文地址:https://blog.csdn.net/Aileenvov/article/details/133613091