前缀,中缀,后缀表达式(逆波兰表达式)_韩顺平听课学习记录

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.完整逆波兰计算器和小结(考虑小数)

posted @ 2021-09-05 23:00  CH0701  阅读(175)  评论(0)    收藏  举报