(笔记)前缀,中缀,后缀表达式

这一部分是王道书上没有的内容,根据视频内容整理

概念

Reverse Polish notation 逆波兰表达式(后缀表达式)
Polish notation 波兰表达式(前缀表达式)

中缀表达式:运算符在两个操作数中间,(如:a+b)
后缀表达式:运算符在两个操作数后面,(如:ab+)
前缀表达式:运算符在两个操作数前面,(如:+ab)

转换和计算

中缀表达式转后缀表达式(手算)

①确定中缀表达式中各个运算符的运算顺序(运算顺序不唯一,因此对应的后缀表达式也不唯一)
②选择下一个运算符,按照(左操作数 右操作数 运算符)的方式组成一个新的操作数
③如果还有运算符没被处理,就继续②
在这里插入图片描述
“左优先”原则:只要左边的运算符能先计算,就优先算左边的
在这里插入图片描述

中缀表达式转后缀表达式(机算)

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符
从左到右处理各个元素,直到末尾。可能遇到三种情况
①遇到操作数。直接加入后缀表达式
②遇到界限符。遇到“(”直接入栈,遇到")"则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(”不加入后缀表达式
③遇到运算符。依次弹出栈中优先级高于等于当前运算符的运算符,并加入后缀表达式,若碰到“(”则停止。之后再把当前运算符入栈
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式

后缀表达式的计算(手算)

从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算。
注意:两个操作数的左右顺序

在这里插入图片描述

后缀表达式的计算(机算)

①从左到右扫描下一个元素,直到处理完所有元素
②若扫描到操作数则压入栈,并回到①,否则执行③(注意:先出栈的是“右操作数”
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,然后回到①,若表达式合法,则最后栈中只会留下一个元素,就是最终结果

中缀表达式转前缀表达式(手算)

①确定中缀表达式中各个运算符的运算顺序
②选择下一个运算符,按照(运算符 左操作数 右操作数)的方式组合成一个新的操作数
③如果还有运算符没被处理,就继续②
“右优先”原则:只要右边的运算符能先计算,就优先算右边的
在这里插入图片描述

前缀表达式的计算(手算)

从右往左扫描下一个元素,直到处理完所有元素(注意:先出栈的是“左操作数”
②若扫描到操作数则压入栈,并回到①,否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

中缀表达式的计算(机算)(重点)

初始化两个栈,操作数栈运算符栈
若扫描到操作数,则压入操作数栈
若扫描到运算符或界限符,则按照“中缀转后缀”相同逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈中的栈顶元素,并执行相应计算,运算结果再压回操作数栈)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文献

[1]王道论坛. 2022年数据结构考研复习指导[M]. 北京:电子工业出版社,2021.1

猜你喜欢

转载自blog.csdn.net/qq_50710984/article/details/113999480