前缀,中缀,后缀表达式(逆波兰表达式)_韩顺平听课学习记录
36.前缀,中缀,后缀表达式的规则
前缀表达式:
- 从右至左扫描表达式
- 遇到运算符弹出栈顶的两个数,运算后结果入栈
前缀表达式应用实例:

中缀表达式:
- 利于人理解,对计算机不友好
- 常转化为后缀表达式来操作

后缀表达式(逆波兰表达式):
- 后出栈数减去前出栈数(顺序与前缀表达式不一致)

后缀表达式原理即应用分析:

37.逆波兰(后缀)计算器分析和实现1

- 表达式的获取:用数组代替索引指针,扫描表达式放入数组中

实现逆波兰表达式的计算逻辑,参照上一节
- 逆波兰表达式实现计算器的优点,只需要一个栈
- 正则表达式判断取出来的是不是数,不是则弹出两个数进行运算
- 先弹出栈的数用num2接收,后弹出的数用num1接收,执行减法/除法运算时,则可用:num1-num2,num1/num2
- 判断弹出来的是什么符号,并进行相应的计算
- 将计算结果res入栈(整数转字符串),重复
- 最后留在栈中的数据,就是运算结果,return(字符串转整数)

38.逆波兰计算器分析和实现2
- 逆波兰表达式的转换:
- 4*5-8+60+8/2 ——> "4 5 * 8 + 60 + 8 2 / +"
39.中缀转后缀表达式思路分析(由计算机专家设计,理解应用,自创很难)
- 后缀表达式对人不方便,在计算机内实现中缀到后缀的转换
- ‘( ’ 并不是运算符,他是控制程序顺序的变量,不参加运算符优先级的比较
- 运算符优先级比较,同级别则弹出符号栈栈顶元素,执行4.3


- 中缀转后缀表达式应用案例:
- 1+((2+3)*4)-5转后缀表达式"1 2 3 + 4 * + 5 -"

- 结果s2栈依次弹出,结果逆序则为中缀表达式对应的后缀表达式

40.中缀转后缀表达式代码实现1
- 直接对字符串进行操作不方便,先将中缀表达式转化为对应的List

41.中缀转后缀表达式代码实现2
- 将得到的中缀表达式的对应的List,转化为后缀表达式对应的List(具体步骤参照39节)
- s2栈用数组结构,不需要使用栈(没有pop操作,只是存数据,最后逆序输出,栈实现麻烦)

- 编写一个类Operation,返回一个运算符对应的优先级

- 1-6


- 7-8,不需要逆序,栈从栈顶弹出数据存入有序的ArrayList中,ArrayList顺序输出即是栈的倒序输出

-
注意要把()消除掉,遍历ls中,else if (item.equals(")"));
-
main

42.完整逆波兰计算器和小结(考虑小数)


浙公网安备 33010602011771号