直接解析中缀表达式

预处理

  • 判断表达式的合法性:1.如果表达式长度为1,且不是数字,2.如果表达式中开头一位为运算符(负号(减号)和左括号除外),3.如果是最后一位是运算符(右括号除外),4.1.1 小数点左、右任意一边不为数字,左括号”(“后面有:+ x ÷ ) .,左括号”(“前面有:数字、”)” ,可以认为是乘法,在左括号”(“前面插入”x”,右括号”)”前面为:+、- x ÷ . (,4.4.1 @”+”,@”-“,@”x”,@”÷”,@”.” 左边或右边包含 @”+”,@”-“,@”x”,@”÷”,@”.”,5. 括号不匹配的情况,
  • 在数字和符号之间插入空格,以空格为分隔符去除字符串中的数字和符号,放入数组Array中,

表达式计算

基本思想:
  • 优先级:括号 > 乘除 > 加减
  • 若没有括号,四则运算,从前向后先算表达式中的乘除,再最后一次算一遍加减。1+2*3-4÷2
  • 若有括号,非嵌套时,将括号对内部的表达式按四则运算计算,有括号嵌套,则利用递归思想,从最内层括号向外计算
程序实现:

构建两个栈,数栈和操作符栈。

  1. 如果是数字,

    • 操作符栈为空,或栈顶(数组的最后一个对象)为加减,则加入数栈
    • 否则,若操作符栈为乘除,则加入数栈,,判断数栈中倒数第2个元素是否为数字,若是,则进行计算,并将结果加入到数栈中,若不是数字(而是左括号)则继续后续遍历。
  2. 如果是操作符,入操作符栈

  3. 如果是左边括号:入数栈

  4. 如果是右边括号:查找左括号在numberArray中的位置,表达式中左括号后面首个操作符在operatorArray中的位置,计算括号内部结果,用结果代替左括号的位置,然后判断前面的操作符是否为乘除,若是,则继续计算。

  5. 最后剩下加减表达式,这时再来一次加减计算:从左到右遍历计算。

1 + 2 *(3 + 4 * 5)

计算过程数栈操作符栈
11
21+
31、2+
41、2+、*
51、2、(+、*
61、2、(、3+、*
71、2、(、3+、*、+
81、2、(、3、4+、*、+
91、2、(、3、4+、*、+、*
10.11、2、(、3、4、5+、*、+、*
10.21、2、(、3、20+、*、+
111、2、23+、*
121、46+
1347
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值