• 表达式问题总结


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

    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
  • 相关阅读:
    Permutation Sequence
    Anagrams
    Unique Binary Search Trees II
    Interleaving String
    Longest Substring Without Repeating Characters
    Sqrt(x)
    Maximum Product Subarray
    Jump Game II
    Container With Most Water
    C结构体的初始化和赋值
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/2759563.html
Copyright © 2020-2023  润新知