zoukankan      html  css  js  c++  java
  • 后缀表达式

    后缀表达式

    不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *

    中缀表达式

    是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

    前缀表达式

    前缀表达式就是不含括号的算术表达式,而且它是将运算符写在前面,操作数写在后面的表达式,为纪念其发明者波兰数学家Jan Lukasiewicz也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。

    使用栈,可以实现中缀表达式向后缀表达式的转化。

    例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+

    转换原则:

    1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。

    2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。

    3.在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走"("。操作符中,+-优先级最低,()优先级最高。

    4.如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。

    关键点:1.只有操作符进栈,操作数放在输出中。

                   2.当一个操作符进栈时,栈中不能有优先级比自己大或者相同的操作符。

                   3.左括号直接进栈,遇右括号时,栈中元素一直出栈直到左括号。

     

    解如下:

    首先,读入a,并送到输出,然后+被读入并压入栈中。接下来b读入并送到输出,此时状态如下:

    stack:                                        输出:a b

               +

    back  top

     

    接下来读入*,由于优先性比栈顶元素+大(原则3),因此被压入栈顶,接着读入c,并送到输出:

    stack:                                      输出:a b c

            + *

    back top

    然后读入+,由于此时栈顶元素为*,优先级比+大,因此将*弹出,弹出后原来的+变成栈顶元素,由于+的优先性和当前读入的+优先性相等,因此也被弹出(原则3),最后将读入的+压入栈中。因此此时状态如下:

    stack:                                       输出:a b c * +

                +

    back  top

     

    下一个读入的符号是(,由于具有最高优先级,因此将其放入栈中,然后读入d:

    stack:                                       输出:a b c * + d

                 + (

    back     top

    继续读入,此时读入*,除非处理),否则(决不弹出(原则3),因此*被压入栈中,接下来读入e,并送到输出:

    stack:                                      输出:a b c * + d e

                 + ( *

    back        top

    再往后读入的符号是+,将*弹出并输出。(原则3,与之前步骤相似),然后将+压入栈中,接着读入f并送到输出:

    stack:                               输出:a b c * + d e * f

               + ( +

    back       top

    现在读入),因此弹出栈元素直到遇到“(”(原则2):

    stack:                                输出: a b c * + d e * f +

                +

    back  top

    下面又读入一个*,被压入栈中,然后读入g并输出:

    stack:                                    输出: a b c * + d e * f + g

              + *

    back   top

    现在输入为空,弹出栈中所有元素:

    stack :                                    输出: a b c * + d e * f + g * +

    empty         

  • 相关阅读:
    Wauzh原理简析及audit规则风险评估
    浅析这句经常在框架中出现的JS代码加深对bind的理解
    浅析如何做web安全问题
    浅析JavaScript到底是什么
    浅析webpack异步加载原理及分包策略
    浅析JavaScript的执行机制
    浅析如何提高代码可读性复用性拓展性
    浅析代码编译过程
    浅析JavaScript的7种异常类型及如何快速排查
    浅析浏览器是如何调度进程和线程的
  • 原文地址:https://www.cnblogs.com/tech-bird/p/3660116.html
Copyright © 2011-2022 走看看