中缀式转化为后缀式的步骤 (简单计算器 的实现)

中缀转后缀需要处理的有:
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配,(函数参数的个数是否正确等)


基本思路如下:
用一个链表 List<ExpressionToken> 储存将要生成的后缀表达式
用一个栈 Stack<OperatorType> 储存操作符
判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级,
如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈,如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。
举例:  15+25*2, 共有 15, +, 25, *, 2 五个符号,下面一步步列出每一步操作
第一步: 数字加入后缀表达式
 操作符栈  空 
 后缀表达式  15 
第二步:+ 号 压入操作符栈
 操作符栈  + 
 后缀表达式  15 
第三步:
 操作符栈  + 
 后缀表达式  15 25
 
第四步:是一个*号,因为*号的优先级比+号高,所以直接压入操作符栈中
 操作符栈  + *
 
 后缀表达式  15 25
 
第五步:
 操作符栈  + *
 
 后缀表达式  15 25 2
 
第六步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果
 操作符栈  空 
 后缀表达式  15 25 2 * +
 


那假如括号呢?例如 (15 + 25) * 2, 共有7个符号,每一步的操作为
第一步: 左括号直接压入操作符栈
 操作符栈  ( 
 后缀表达式  空
 
第二步:数字加入表达式中
 操作符栈  ( 
 后缀表达式  15 
第三步:+号压入操作符栈
 操作符栈  ( +
 
 后缀表达式  15  
第四步:数字加入表达式中  操作符栈  ( +
 
 后缀表达式  15 25
 
第五步:遇到反括号了,将两个括号之间操作符依次加入到表达式中,并删除匹配的正括号
 操作符栈  空
 
 后缀表达式  15 25 +
 
第六步:*号压入操作符栈
 操作符栈  * 
 后缀表达式  15 25 +
 
第七步:数字加入表达式中
 操作符栈  * 
 后缀表达式  15 25 + 2
 
第八步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果  操作符栈  空 
 后缀表达式  15 25 + 2 *
 
这样就可以看出优先级对表达式的影响。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值