表达式问题总结

人工转换给出一个中缀表达式转换前缀表达式和后缀表达式:

a+b*c-(d+e)

第一步:按照运算符的优先级对所有的运算单位加括号~

式子变成拉:((a+(b*c))-(d+e))

第二步:转换前缀与后缀表达式

前缀:把运算符号移动到对应的括号前面

  则变成拉:-( +(a *(bc)) +(de))

  把括号去掉:-+a*bc+de  前缀式子出现

后缀:把运算符号移动到对应的括号后面

  则变成拉:((a(bc)* )- (de)+ )-

  把括号去掉:abc*-de+-  后缀式子出现

发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。

 

中缀表达式转换为后缀表达式算法:

  ·数字时,加入后缀表达式;

  ·运算符:

    a. 若为 '(',入栈;

    b. 若为 ')',则把栈中的的运算符加入后缀表达式中,直到 '(',从栈中删除'(' ;

    c. 剩下的运算符中, 若其优先级高于其它所有的运算符,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号就停止。

    >>这句话不好理解,可以说成这样,从栈顶开始,依次弹出出当前处理的运算符优先级高的运算符,直到一个比它优先级低的或者遇到了一个左括号就停止。

  ·当扫描的中缀表达式结束时,栈中的的所有运算符入栈;

PS:中缀直接转前缀会比较麻烦,所以可以通过中缀转后缀构造表达式树再转前缀。

运用后缀表达式进行计算的具体做法:

  ·建立一个栈S

  ·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X   运算符   Y”的形式计算机出结果,再压加栈S中

  ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束

举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
原文地址:https://www.cnblogs.com/AbandonZHANG/p/2759563.html