中缀表达式转后缀表达式 (中缀表达式的计算)

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

基本思路如下:
用一个链表 List 储存将要生成的后缀表达式
用一个栈 Stack 储存操作符
判断当前节点, 如果是操作数, 直接加入后缀表达式中, 如果是操作符,则比较前一个操作符和当前操作符的优先级
如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈(从顶到栈底),如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。
举例: 15+25*2, 共有 15, +, 25, *, 2 五个符号,下面一步步列出每一步操作

第六步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果


那假如括号呢例如 (15 + 25) * 2, 共有7个符号,每一步的操作为
第一步: 左括号直接压入操作符栈

操作符栈(
后缀表达式

第二步:数字加入表达式中

操作符栈(
后缀表达式15

第三步:+号压入操作符栈

操作符栈( +
后缀表达式15

第四步:数字加入表达式中

操作符栈( +
后缀表达式15 25

第五步:遇到反括号了,将两个括号之间操作符依次加入到表达式中,并删除匹配的正括号

操作符栈
后缀表达式15 25 +

第六步:*号压入操作符栈

操作符栈*
后缀表达式15 25 +

第七步:数字加入表达式中

操作符栈*
后缀表达式15 25 + 2

第八步:没有符号了,直接将操作符栈中剩余的依次加到表达式中,最终的结果

操作符栈
后缀表达式15 25 + 2 *

这样就可以看出优先级对表达式的影响。

 

//以上转自Internet..........

 

注:对于+,-作为一无运算符时,优先级较高(仅低于'('),可转化为另一符号,以与 其二元相区别.

 

对于后缀表达式的计算:

  如:15 25 + 2 *

  顺序扫描运算符,若发现运算符 A,就对紧邻其前的数据进行运算,并以新的结果替换原操作数(若A是一元,则将其前操作数operand1=( A operand1 ), 若A是二元的,则 operand1 = operand1 A operand2 , delete operand2 ..}, 同时删除此运算符....

 

 

对中缀表达式的另一种计算方法:

利用一个栈计录运算符,另一栈记录操作数,边扫描边计算或压栈....(数据结构-来蔚敏)

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值