中缀表达式转化为后缀表达式(栈的应用)

中缀表达式:是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例: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

中缀表达式转化后缀表达式的步骤如下: 1. 初始化一个一个后缀表达式。 2. 从左到右扫描中缀表达式的每个元素。 3. 如果当前元素是操作数,则将其添加到后缀表达式的末尾。 4. 如果当前元素是左括号,则将其压入中。 5. 如果当前元素是右括号,则将中的元素弹出并添加到后缀表达式中,直到遇到左括号。左括号不会被添加到后缀表达式中,也不会被弹出。 6. 如果当前元素是运算符,则比较其与顶运算符的优先级。如果当前运算符的优先级小于或等于顶运算符的优先级,则将顶运算符弹出并添加到后缀表达式中,直到当前运算符的优先级大于顶运算符的优先级或为空,然后将当前运算符压入中。 7. 重复步骤2至6,直到扫描完整个中缀表达式。 8. 如果中还有元素,则将它们依次弹出并添加到后缀表达式中。 例如,将中缀表达式 - + 6 * 3 - 7 4 / 8 2 转化后缀表达式的过程如下: - 首先,初始化一个一个后缀表达式。 - 从左到右扫描中缀表达式的每个元素: - 第一个元素是减号,是运算符,将其压入中。 - 第二个元素是加号,是运算符,由于为空,将其压入中。 - 第三个元素是数字6,是操作数,将其添加到后缀表达式的末尾。 - 第四个元素是乘号,是运算符,将其压入中。 - 第五个元素是数字3,是操作数,将其添加到后缀表达式的末尾。 - 第六个元素是减号,是运算符,将其压入中。 - 第七个元素是数字7,是操作数,将其添加到后缀表达式的末尾。 - 第八个元素是数字4,是操作数,将其添加到后缀表达式的末尾。 - 第九个元素是除号,是运算符,将其压入中。 - 第十个元素是数字8,是操作数,将其添加到后缀表达式的末尾。 - 第十一个元素是数字2,是操作数,将其添加到后缀表达式的末尾。 - 扫描完整个中缀表达式后,中还有运算符,将其依次弹出并添加到后缀表达式中,得到后缀表达式 6 3 * 7 4 - + 8 2 / -。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值