3.3.2_1栈在表达式求值中的应用(上)

知识总览:

大家熟悉的算数表达式:

操作数就是下边的数,运算符就是+-*/,界限符就是(),去掉界限符之后运算的操作顺序发生改变,即界限符是必不可少的

波兰数学界的灵感:

后缀表达式又叫逆波兰表达式,前缀表达式又叫波兰表达式

中缀、前缀、后缀表达式

中缀表达式:运算符在2个操作数中间

后缀表达式:运算符在2个操作数后边,ab顺序不能颠倒,ab+即a+b=b+a,但是ab/即a/b≠b/a

前缀表达式: 运算符在2个操作数前边,ab顺序不能颠倒,+ab即a+b=b+a,但是/ab即a/b≠b/a

如下为中缀转前缀和后缀,a+b-c先算a+b和先算b-c的后缀和前缀的转换结果不同

中缀转后缀:

先把中缀上的运算符的先后顺序标出来,再按照运算符操作顺序先后计算转成后缀表达式,每转一次就把已经转的表达式看成一个整体,根据中缀表达式中的操作数的左右顺序再在后缀中把操作数放到对应左右位置

运算符出现在后缀表达式的从左到右的先后顺序和中缀表达式的运算符的生效顺序相同

左优先原则:

只要左边的运算符能先计算,就优先算左边的

如下A+B-C*D/E+F,一般不使用左优先原则会先算乘除再算加减,顺序就变成C*D /E A+B - +F,如果使用左优先原则,左边的A+B运算符能先计算,则先算A+B,然后是-C*D,左边的减法不能算,则算C*D,算完C*D左边的减法依然不能先算则要算/E,然后现在变成A+B之后的值的减法再+F,左边减法可以先算,则先算减法,最后算+F,如下转成后缀表达式之后,后缀表达式的运算符号的顺序和中缀表达式转成后缀的标号顺序相同

中缀转后缀如何计算:

用栈实现后缀表达式运算:

后缀表达式从左往右扫,扫描到操作数的的时候压入栈中,扫描到运算符的时候,把2个栈顶元素弹出,执行相应运算,再把运算结果压入栈中

中缀转前缀:

右优先原则:

只要右边的运算符能先计算,就优先算右边的。

如下A+B*(C-D)-E/F,如果不按照右优先一般是先算C-D,再算*法,再算+,然后再算/,最后算减法,如果按照右优先原则,则从右往左看,E/F可以先算则先算/法,然后减法和括号对比减法不能先算则再算括号,乘法和减法相比先算乘法,剩+法和-法,则可以先算减法,则最后算A+

可以看到,按照右优先顺序转成前缀了之后,运算符号从右到左的生效顺序即出现顺序和在前缀表达式中按照右优先原则标注的符号的生效顺序相同(左优先同)

用栈实现前缀表达式的计算:

前缀表达式从右往左扫描,扫描到操作数压入栈中,扫描到运算符弹出栈顶的2个元素,进行相应的运算,再把运算结果压入栈中,注意先出栈的是左操作数(和后缀相反)

注意:左优先、右优先原则实际并没有,是咸鱼学长为了能让容易理解杜撰的,考试中不建议出现

知识回顾:

。。。。。。。。。。。。。。。。。。

相关推荐
chuan.bai9 分钟前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法
SL_staff11 分钟前
销售知识管理的断点分析与技术解法:从3天找话术到秒级检索
java·开源·github
荣码13 分钟前
向量数据库选型:4种方案全测了,选错重来成本最高
java·python
rannn_11114 分钟前
【力扣hot100】二叉树专题+总结
java·算法·leetcode·二叉树
摇滚侠39 分钟前
《Docker技术入门与实战 第4版》阅读笔记 6 使用 Dockerfile 创建镜像 2
java·笔记·docker
余额瞒着我当琳1 小时前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
资源大佬星 课it1 小时前
黑马 Java+AI新版V16零基础就业班视频课程百度网盘下载
java·开发语言·人工智能
二十雨辰1 小时前
[Java]-微服务面试题
java·开发语言·微服务
我命由我123451 小时前
Compose Codelab 学习 - Compose 中的基本布局
android·java·java-ee·kotlin·android studio·android-studio·android runtime
莫得感情 o2 小时前
并发 11 · 同步工具类
java·并发