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

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

知识回顾:

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

相关推荐
aiks_yuan1 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang2 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang2 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
聪明的笨猪猪3 小时前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
软件技术NINI4 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang4 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了5 小时前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff6 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶6 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
秋天的怀念_David7 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法