[数据结构]中缀(即算术)表达式转后缀

文章摘自知乎
示例表达式:[(A+B)*C]-[E-F]

转化为前缀表达式:

先计算A+B,转化为+AB
+AB作为整体与C运算,转化为*+ABC
运算E-F,转化为-EF
将*+ABC与E-F都作为整体执行-运算,转化为-*+ABC-EF

转化为后缀表达式:

先计算A+B,转化为AB+
AB+作为整体与C运算,转化为AB+C*
运算E-F,转化为EF-
将AB+C与EF-作为整体执行-运算,转化为AB+CEF–
用栈实现中缀表达式转化为后缀表达式
算法思想
如果检测到数字,则直接加入到后缀表达式中

如果检测到运算符时:

若为‘(’,入栈
若为‘)’,则依次将栈中的运算符加入后缀表达式,直到出现‘(’,并从栈中删除‘(’
若为‘+’,‘-’,‘*’,‘/’
栈空,入栈
栈顶元素为‘(’,入栈
高于栈顶元素优先级,入栈
否则,依次弹出栈顶运算符,直到一个优先级比它低的运算符或‘(’为止
遍历完成,若栈非空,依次弹出栈中所有元素

该算法使得栈顶运算符处于较高优先级,并先弹出栈,进入后缀表达式

过程分析
示例:((A+B)*C)-(E-F)

1.连续两个’(’,入栈

(当前后缀表达式: )

在这里插入图片描述

前缀表达式遍历进度((
2.遍历到数字A,加入到后缀表达式

(当前后缀表达式:A)
在这里插入图片描述

前缀表达式遍历进度((A
3.遍历到运算符+,由于栈顶元素为‘(’,直接入栈。

(当前后缀表达式:A)

4.接着遍历数字B,加入到后缀表达式

(当前后缀表达式:AB)
在这里插入图片描述

前缀表达式遍历进度((A+B
5.遍历‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’

(当前后缀表达式:AB+)

注:括号是不会出现在后缀表达式或前缀表达式中的

在这里插入图片描述

前缀表达式遍历进度((A+B)
6.遍历到*,栈顶为‘(’,直接入栈

7.接着遍历数字C,直接加入到后缀表达式中

(当前后缀表达式:AB+C)
在这里插入图片描述

前缀表达式遍历进度((A+B)*C
8.继续遍历到‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’

【当前后缀表达式:AB+C*】
在这里插入图片描述

前缀表达式遍历进度((A+B)*C)
9.接着遍历到-,栈空,入栈

【当前后缀表达式:AB+C*】

在这里插入图片描述

前缀表达式遍历进度((A+B)*C)-
10.遍历‘(’,直接入栈

【当前后缀表达式:AB+C*】

在这里插入图片描述

前缀表达式遍历进度((A+B)*C)-(
11.遍历到数字E,直接加入到后缀表达式

【当前后缀表达式:AB+C*E】

12.遍历到-,栈顶元素为‘(’,入栈

【当前后缀表达式:AB+C*E】

13.遍历到F,加入到后缀表达式

【当前后缀表达式:AB+C*EF】
在这里插入图片描述

前缀表达式遍历进度((A+B)*C)-(E-F
14.遍历到‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’

【当前后缀表达式:AB+C*EF-】
在这里插入图片描述

前缀表达式遍历进度((A+B)*C)-(E-F)遍历完毕
15.遍历完毕,栈非空,将栈中元素依次弹出

【当前后缀表达式:AB+C*EF–】

在这里插入图片描述

成功得到后缀表达式!!!

原文链接:半颗糖逗的知乎文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值