前缀,中缀和后缀表达式

中缀表达式转化为后缀表达式
a + b*c + (d * e + f) 转化为后缀表达式过程
方法一:转换过程需要用到栈,具体过程如下:
1.如果遇到操作数,直接将其输出
2.如果遇到操作符,将其压入栈中,如果遇到左括号,也将其压入栈中
3.如果遇到右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止,注意,左括号只弹出不输出
4.如果遇到任何其他的操作符,如果栈顶操作符比该操作符等级高或者相等就弹出栈顶操作符直至栈顶操作符比该操作符等级低或者栈空<级别高的或在前面的先进行运算>
5.如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

方法二:
)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(bc) ) + ( ((de)+f) ))
2)将运算符移到括号的后面,变成((a(bc))+(((de)f))+
3)去掉括号,得到abc
+de
f+

计算后缀表达式的值
(1)从左到右扫描, 若遇到数字,入栈。
(2) 若遇到运算符,取出栈顶的2个元素(栈下面一点的元素在操作符左边,栈上面一点的元素在操作符右边)(次顶元素 op 栈顶元素),并将结果入栈,重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

前缀表达式的计算机求值:<画个图就能理解>
1.从右至左扫描表达式,遇到数字时,将数字压入堆栈,
2.遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

中缀表达式转换为前缀表达式
1.初始化两个栈,运算符栈s1和操作数栈s2
2.从右至左扫描
3.遇到操作数时压入栈s2
4.遇到运算符时,比较s1栈顶运算符的优先级,
4.1.若栈为空或运算符为“)”,则直接进栈,
4.2 否则栈顶运算符优先级比该操作符高就出栈,直到遇到相等或小的 或者栈空
5.遇到括号时:
5.1如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

猜你喜欢

转载自blog.csdn.net/weixin_43425693/article/details/90019129