• 逆波兰表达式


    逆波兰表达式又称为前缀表达式是一种十分有用的表达式,将中缀表达式转换为前缀表达式后,就可以只依靠出栈、入栈两种简单操作完全解决中缀表达式的全部运算。
    例如,(a+b)*(c+d)转换为*,+,a,b,+,c,d。
    后面的前缀表达式的运算方式为:如果当前字符(或字符串)为数字或变量,则压入栈内;如果是运算符,则将栈顶两个元素弹出栈外并作相应运算,再将结果压入栈内。当前缀表达式扫描结束时,栈里的就是中缀表达式运算的最终结果。对比中缀运算的步骤,不难发现前缀运算在计算机上的优势。

     

    (1) 首先构造一个运算符栈(也可放置括号),运算符(以括号为分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。
    (2)从右至左扫描中缀表达式,从右边第一个字符开始判断:
    如果当前字符是数字,则分析到数字串的结尾并将数字串直接输出。
    如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。
    如果是括号,则根据括号的方向进行处理。如果是向右的括号,则直接入栈;否则,遇向左的括号前将所有的运算符全部出栈并输出,遇右括号后将向左、向右的两括号一起出栈(并不输出)。
    (3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再逆缀输出字符串。中缀表达式也就转换为前缀表达式了。
     
    根据转换规则,将给出的中缀表达式转换为前缀表达式。
    输入格式:
    一行以#结尾的且只包含整数和运算符的中缀表达式。
    输出格式:
    一行,对应的前缀表达式。注意,相邻的两个运算符或操作数之间用一个空格隔开。
    为简化操作,表达式中只包含+-*/四种运算符,没有任何括号。
    样例输入:4*5+6/3#
    样例输出:+ * 4 5 / 6 3 
     
  • 相关阅读:
    10.16作业
    day0402作业
    day04作业
    10.13作业
    JVM原理最全、清晰、通俗讲解
    Java的SimpleDateFormat,DateTimeFormatter:YYYY与yyyy
    从源码层面理解 ArrayList 扩容策略
    哈夫曼树
    面向对象三大基本特性,五大基本原则
    数据结构
  • 原文地址:https://www.cnblogs.com/bytebull/p/11961679.html
Copyright © 2020-2023  润新知