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

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

知识回顾:

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

相关推荐
huan_199331 分钟前
通过docker构建一个java镜像
java·docker
岁忧39 分钟前
(LeetCode 面试经典 150 题) 82. 删除排序链表中的重复元素 II (链表)
java·c++·leetcode·链表·面试·go
_herbert2 小时前
MAVEN构建分离依赖JAR
java
野犬寒鸦2 小时前
Pipeline功能实现Redis批处理(项目批量查询点赞情况的应用)
java·服务器·数据库·redis·后端·缓存
꧁༺摩༒西༻꧂2 小时前
Spring Boot Actuator 监控功能的简介及禁用
java·数据库·spring boot
Java中文社群2 小时前
快看!百度提前批的面试难度,你能拿下吗?
java·后端·面试
丨千纸鹤丨2 小时前
Tomcat
java·tomcat
发发发发8883 小时前
leetcode 674.最长连续递增序列
java·数据结构·算法·leetcode·动态规划·最长连续递增序列
雨绸缪3 小时前
为什么 Java 在 2025 年仍然值得学习:开发人员的 25 年历程
java·后端·掘金·金石计划