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个元素,进行相应的运算,再把运算结果压入栈中,注意先出栈的是左操作数(和后缀相反)

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

知识回顾:

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

相关推荐
大傻^1 分钟前
Spring AI Alibaba 企业级实战:从0到1构建智能客服系统
java·人工智能·后端·spring·springaialibaba
贼爱学习的小黄6 分钟前
NC BIP增加按钮
java
短剑重铸之日6 分钟前
《ShardingSphere解读》11 解析引擎:SQL 解析流程应该包括哪些核心阶段?(上)
java·后端·spring·shardingsphere·分库分表
Javatutouhouduan10 分钟前
Netty进阶指南:基础+中级+高级+架构行业运用+源码分析
java·netty·java面试·网络io·后端开发·java程序员·互联网大厂
编码忘我12 分钟前
java开发模式之静态代理、动态代理、CGLIB代理
java
冬夜戏雪13 分钟前
实习面经摘录(八)
java
拾年27515 分钟前
别再让 NullPointerException 搞崩你的代码了!Optional + Stream 组合拳详解
java
weixin_4041576817 分钟前
Java高级面试与工程实践问题集(一)
java·开发语言·面试
cyforkk19 分钟前
Spring AOP 进阶:揭秘 @annotation 参数绑定的底层逻辑
java·数据库·spring
清风徐来QCQ19 分钟前
Java2(valueOf,Character,StringBuilder,设计模式)
java·开发语言