【数据结构】栈的应用-将中缀表达式转化为后缀表达式

1、后缀表达式简介

后缀表达式即逆波兰式,是波兰逻辑学家卢卡西维奇(Lukasiewicz)于1929年发明的一种表示表达式的方法。区别于我们常用的中缀表达式(如2+3*5),后缀表达式是将每个运算符放到操作数之后,没有优先级和括号,例如2 3 5 * + 。

2、中缀表达式转后缀达式的方法

定义一个栈S,存储运算符和操作数。

1、如果检测到操作数,直接加入后缀表达式。

2、如果检测到运算符:

a、如果栈S为空或者运算符为"("或者栈顶运算符为"(",直接加入栈中;

b、如果是"(",则依次将栈中运算符弹出加入到后缀表达式中,直到遇到"("停止,并删除"("。

c、如果是"+"、"-"、"*"、"/"运算符:

  • 如果栈S为空或者顶运算符为"(",直接加入栈中;
  • 如果当前运算符优先级高于栈顶运算符,则直接入栈;
  • 否则,依次弹出栈顶运算符加入后缀表达式,直到栈顶运算符低于当前运算符或者栈为空或者遇到一个"(",然后将它入栈。

3、遍历完整个中缀表达式后,如果栈非空,则依次弹出加入后缀表达式。

注:后缀表达式不包含括号。

3、举例

有中缀表达式 A+B*(C-D)/E+F/H。

  1. 遇到操作数A加入后缀表达式。此时后缀表达式内容(A)。栈为空。​​
  2. 遇到"+",栈顶为空,直接入栈。此时后缀表达式为(A)。                                              
  3. 遇到B,直接加入后缀表达式。此时后缀表达式为(A B)。                                       
  4. 遇到"*",优先级高于栈顶元素"-",直接入栈。此时后缀表达式为(A B)。                 
  5. 遇到"(",直接入栈。此时后缀表达式为(A B)。                                                        
  6. 遇到C,加入后缀表达式。此时后缀表达式为(A B C)。                       ​​​​​​​                        
  7. 遇到"-",因为栈顶为"(",所以直接入栈。此时后缀表达式为(A B C)。        ​​​​​​​                 
  8. 遇到D,加入后缀表达式。此时后缀表达式为(A B C D)。                      ​​​​​​​                       
  9. 遇到")",依次弹出栈顶元素,直到遇到"(",并删除"("。此时后缀表达式为(A B C D -)。    
  10. 遇到”/",优先级并不大于栈顶运算符"*",故弹出"*",遇到"-",优先级小于它,则终止,将"/"入栈。此时后缀表达式为(A B C D - * )。                                                                  
                                                              ​​​​​​​                    ​​​​​​​                          ​​​​​​​      ​​​​​​​         
  11. 此后类似,不再列举,直到遍历完整个中缀表达式。此时后缀表达式为(A B C D - * E / + F H ),而非空。                                                                                                       ​​​​​​​  ​​​​​​​        
  12. 依次弹出栈中元素加入后缀表达式,得到最终的后缀表达为(A B C D - * E / + F H / +)。

完结撒花~~~如果对您有帮助,还请多多支持哦,谢谢!

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HnuRookie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值