逆波兰表达式

Posted bytebull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆波兰表达式相关的知识,希望对你有一定的参考价值。

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

 

(1) 首先构造一个运算符栈(也可放置括号),运算符(以括号为分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。
(2)从右至左扫描中缀表达式,从右边第一个字符开始判断:
如果当前字符是数字,则分析到数字串的结尾并将数字串直接输出。
如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。
如果是括号,则根据括号的方向进行处理。如果是向右的括号,则直接入栈;否则,遇向左的括号前将所有的运算符全部出栈并输出,遇右括号后将向左、向右的两括号一起出栈(并不输出)。
(3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再逆缀输出字符串。中缀表达式也就转换为前缀表达式了。
 
根据转换规则,将给出的中缀表达式转换为前缀表达式。
输入格式:
一行以#结尾的且只包含整数和运算符的中缀表达式。
输出格式:
一行,对应的前缀表达式。注意,相邻的两个运算符或操作数之间用一个空格隔开。
为简化操作,表达式中只包含+-*/四种运算符,没有任何括号。
样例输入:4*5+6/3#
样例输出:+ * 4 5 / 6 3 
 

以上是关于逆波兰表达式的主要内容,如果未能解决你的问题,请参考以下文章

递归--逆波兰表达式

波兰表达式与逆波兰表达式介绍及中缀表达式转逆波兰表达式代码实现

逆波兰算术表达式 C语言

逆波兰表达式

c语音编程,逆波兰表达式求值

逆波兰表达式