后缀表达式 和 中缀表达式(波兰表达式/逆波兰表达式)

前言

后缀表达式 和 中缀表达式(波兰表达式/逆波兰表达式)_第1张图片
由两类对象构成

  • 运算数:如5,6,2,3,4
  • 运算符号:如+,/,-,*

运算符号的优先级不同
计算机处理表达式,它并不能像人一样有逻辑的去判断先处理哪一步,后处理哪一步,它只会严格的按照从左至右执行。
就像5+6/2 按照计算机的思维 就是 (5+6)/2 这个6 是否拿来做加法运算,按照计算机的思维是不知道的
所以我们引入了一种表达式,叫做后缀表达式

后缀表达式

后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。
中缀表达式:5+6/2-34
后缀表达式:562/+34
-
这两个表达式是等价的

后缀表达式计算

例如562/+34*-
利用堆栈思想
在这里插入图片描述
先将前三个数字压入,之后遇到了运算符号/
则将 2 和 6 pop 出栈,计算 6/2(后出栈的运算数在运算符之前)得到3,在将 3 push入栈
此时
在这里插入图片描述
后遇到 + 运算符号,则如上 将 3 和 5 pop出栈 进行 5+3=8
8 push入栈
之后遇到数字,继续 push 入栈
此时
在这里插入图片描述
遇到运算符,如上的方法进行运算,以此类推,得到值为-4.

中缀表达式转化为后缀表达式

对于表达式A+B∗(C−D)−E/F
从左往右,遇到数字,直接输出
遇到符号,压入栈中,遇到左括号时我们也将其放入栈中
如果遇到一个右括号,则将栈元素弹出并输出,将弹出的操作符输出直到遇到左括号为止。
遇到其他符号,判断其优先级是否比栈顶符号优先级大,若大,则压入,若小或者相同优先级,则pop栈顶符号,直至栈顶符号优先级小于待比较符号

下面进行操作

后缀表达式 和 中缀表达式(波兰表达式/逆波兰表达式)_第2张图片
下面进行解释:
1-4操作从左往右。遇到数字输出,遇到符号压栈,第四步,遇到 “*” 乘号优先级比加号高,所以继续入栈

5-7操作,第五步遇到“(” 将其入栈,后按照顺序,将CD输出,减号 “-” 入栈 第七步遇到右括号,则按照规则,将符号pop出栈,遇到左括号位置,也就是pop出 “-” 号 并输出,并将 “(” 也pop出栈,但不输出。

第八步操作,遇到符号 “-” 其优先级和 “+”相同,则将 “ + ” pop出兵输出(此处有两个加号 均pop输出) 再将 “ - “ push 入栈

第九步遇到E直接输出,第十步遇到 " / " 其优先级大于 " - "
则直接入栈,第十一步,也就是最后一步,F直接输出,表达式已到终点,之后没有其他运算符号,则直接将栈中的符号pop输出出来
也就是ABCD-*+EF/-

后缀表达式转化为中缀表达式

ABC*+DEF+G+
把后缀表达式逐个元素的压入到栈中,当压入的都是数字,则不采取任何操作,当压入的是运算符,则把运算符下面的两个数字弹出和运算符进行运算,然后把结果继续压入到栈中。
后缀表达式 和 中缀表达式(波兰表达式/逆波兰表达式)_第3张图片
表达式为K2 + K5
k2 = A + K1 = A + B*C
K5 = K4 * G = (K3+F) * G=(D * E+F)*G
K2 + K5 =A + B * C + (D * E + F)*G

因初学数据结构,若有错误欢迎指出

你可能感兴趣的:(数据结构与算法,堆栈,栈,数据结构,stack,c++)