zoukankan      html  css  js  c++  java
  • 中缀表达式转化为后缀表达式(栈的应用)

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

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


    中缀表达式转化为后缀表达式规则:

    从左至右读取中缀表达式中的元素,当遇到操作数时直接输出,当遇到操作符时,按以下规则处理:

    1)如果遇到的是直接压入栈中

    2)如果遇到的是“)”,依次将栈中元素弹出,直到遇到“)”为止,但“)”只弹出,并不输出

    3)如果遇到的是非括号(即“+”,“-”,“*”,“/”),那么从栈中弹出栈元素直到发现优先级更低的元素或栈为空为止。当从栈弹出元素的工作完成后,再将刚刚读入的操作符压入栈中。


    例:

       将中缀表达式a+b*c+(d*e+f)*g转化为后缀表达式,结果为 a b c * + d e * f + g * +

    首先,a被读入,直接输出。然后,“+”被读入并压入栈中。接着b读入并输出:


                            


    接着“*”读入。栈顶元素比“*”的优先级低,故没有输出,“*”进栈。接着,c被读入并输出:


                            


    后面的一个符号是“+”号。此时,栈顶元素“*”的优先级比“+”高,故需将“*”从栈中弹出并输出;弹出后栈顶元素为“+”号,优先级并不比刚读入的“+”号优先级低,故依然将栈顶元素“+”弹出。然后将刚刚遇到的“+”压入栈中


                         


    下一个被读入的符号是“(”,由于有最高的优先级,因此直接压入栈中。然后,d读入并输出。


                          


    紧接着,又读入一个“*”。除非遇到“)”,否则“(”绝不会从栈中弹出,因此,没有输出。下一个读入e,直接输出。


                        


    再往后读入符号“+”。依据规则3,我们将“*”弹出并输出,然后将“+”压入栈中。然后,读入f并输出


                          


    现在,读到一个“)”,依据规则2,将栈元素依次弹出并输出,直到“)”弹出。


                         


    接着又读入一个“*”,压入栈中。然后读入g并输出


                             

    现在输入为空,因此我们将栈中的符合全部弹出并输出,直到栈为空


                           

    练习:

    http://acm.nyist.net/JudgeOnline/problem.php?pid=467

    http://acm.nyist.net/JudgeOnline/problem.php?pid=267

  • 相关阅读:
    数据库-插入数据insert,更新数据update,删除数据delete
    前端移动端监听键盘上的 开始/搜索 按键,并触发函数
    移动端input输入框把页面顶起, 收起键盘页面复原不了问题
    微信小程序如何把接口调用成功的回调函数返回的参数return出去?(promise就可以解决!!)
    js判断json数据是否存在某字段的方法
    微信小程序、微信公众号、H5之间能相互跳转
    java JDK的安装和环境配置(windows10)
    接私活必备的 10 个开源项目
    小程序获取自定义属性之e.target与e.currentTarget
    小程序中webview内嵌h5页面
  • 原文地址:https://www.cnblogs.com/riskyer/p/3278489.html
Copyright © 2011-2022 走看看