数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
来源:互联网 发布:windows增加虚拟内存 编辑:程序博客网 时间:2024/09/21 09:21
中缀表达式是一个通用的算术或逻辑公式表示方法。操作符是以中缀形式处于操作数中间。例如:3*4+3-1;
后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右(不再考虑运算符的优先规则)例如:(2+1)*3,即2 1 + 3 *
(以上来自百度百科)
具体的代码实现:代码实现中缀转后缀表达式
1.中缀表达式转为后缀表达式
想要完成此过程需要一个数组arr存放中缀表达式,一个ret 存放后缀表达式,还要借助一个辅助栈stack1存放操作符,stack2存放运算结果。
规则:
从左到右一次遍历中缀表达式,如果是数字就直接存放到后缀表达式中;
如果是操作符,例如操作符A,需要将A于操作符栈stack1的栈顶操作符比较,如果stack1为空或栈顶操作符优先级低于A,将A压入stack1.
如果A的优先级低于或等于stack1栈顶的操作符的优先级,把栈顶操作符pop出栈,存到ret 中,然后继续与A比较,重复此前动作直到A入栈。
注意:
操作符'('和')' 比较特殊。如果是'(' 直接入栈stack1;如果是‘)' 需要将stack1的操作符pop到ret中,直到弹出'(';
重复以上工作,直到把操作符栈stack1中的操作符全部弹出到ret中;这样就把中缀表达转化为后缀表达式;
例如:
中缀表达式:3*1+(4+6)/2-1
第一步:取3,ret[ 3 ] , stack1[ ];
第二步:取*, ret[3] , stack1 [ * ];
第三步: 取1 ,ret[3,1] , stack1 [ * ];
第四步,取+,ret[3,1,*] , stack1 [ + ];
第五步:取(, ret[3,1,*] , stack1 [ + ,( ];
第六步:取4, ret[3,1,*,4] , stack1 [ + ,( ];
第七步:取+, ret[3,1,*,4] , stack1 [ + ,( ,+ ];
第八步:取6,ret[3,1,*,4, 6] , stack1 [ + ,( ,+ ];
第九步:取), ret[3,1,*,4, 6,+] , stack1 [ + ];
第十步:取/, ret[3,1,*,4, 6,+] , stack1 [ + ,/ ];
第十一步:取2,ret[3,1,*,4, 6,+,2] , stack1 [ + ,/ ];
第十二步:取-, ret[3,1,*,4,6,+,2,/, + ] , stack1 [ - ];
第十三步:取1,ret[3,1,*,4,6,+,2,/,+,1 ] , stack1 [ - ];
处理stack1: ret[3,1,*,4, 6,+,2,/, +,1 ,- ] , stack1 [ ];
所以后缀表达式为:3,1,*,4, 6,+,2,/, +,1 ,- ;
2.利用后缀表达式计算结果
规则:遍历储存后缀表达式的列表,将元素依次进栈,当遇到操作符时,连续出栈两个元素,进行运算,再将结果进栈,最后栈内留下的元素就是计算结果
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- 【数据结构】中缀表达式转换后缀表达式(逆波兰式)
- 逆波兰:将中缀表达式转为后缀表达式
- 逆波兰表达式 中缀表达式 后缀表达式
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转后缀表达式(逆波兰表达式)
- 前缀、中缀、后缀表达式(逆波兰表达式)
- 逆波兰式(中缀表达式转成后缀表达式)
- 中缀表达式转后缀表达式(逆波兰式)
- 中缀表达式转后缀表达式(又称逆波兰式)
- 中缀表达式转后缀表达式(逆波兰)
- 数据结构-----栈(逆波兰表达式)----中缀转后缀
- 【数据结构】逆波兰表示法(RPN):中缀表达式转后缀表达式
- 中缀表达式转为后缀表达式
- 中缀表达式转为后缀表达式
- 中缀表达式转为后缀表达式
- 中缀表达式转为后缀表达式
- 中缀表达式转为后缀表达式
- 蓝桥杯:兰顿蚂蚁 JAVA
- day07总结
- leetcode [Same Tree]
- [IOS APP]从唐诗到元曲-蒋勋说中国文学
- Collections工具类中sort排序的两种方式
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- day08
- Java中子类对象初始化的过程
- 颜色字符串转换
- 深入Redux架构
- [bzoj4770]图样
- MySql的建表规范
- 12. Integer to Roman
- 指法修正