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

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

知识回顾:

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

相关推荐
乐悠小码7 分钟前
Java设计模式精讲---01工厂方法模式
java·设计模式·工厂方法模式
cherry--9 分钟前
集合(开发重点)
java·开发语言
寻星探路21 分钟前
测试开发话题10---自动化测试常用函数(2)
java·前端·python
api_1800790546040 分钟前
请求、认证与响应数据解析:1688 商品 API 接口深度探秘
java·大数据·开发语言·mysql·数据挖掘
陈果然DeepVersion40 分钟前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十二)
java·spring boot·ai·kafka·面试题·向量数据库·rag
yours_Gabriel41 分钟前
【设计模式】UML和设计原则
java·设计模式·uml
唐古乌梁海43 分钟前
【Java】JVM 内存区域划分
java·开发语言·jvm
陈果然DeepVersion1 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(九)
java·人工智能·spring boot·微服务·kafka·面试题·rag
dllxhcjla1 小时前
css第一天
java·前端·css
Mos_x1 小时前
Spring 中的 @ExceptionHandler 注解详解与应用
java·后端