一日一练: 基本计算器II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。

这道题还是的使用。

思路:

  1. 遇到 +-*/,先缓存这些运算符
  2. 如果不是运算符,则收集字符串
  3. 根据当前的运算符以及数字
    • +:将字符串转成数字压入栈中
    • -:将字符串转成数字,并取负,压入栈中
    • *:将栈顶元素弹出,与当前字符做乘法,结果再入栈
    • /:将栈顶元素弹出
      • 如果栈顶元素为负数,取正与字符做除法之后再去负,压入栈中
      • 如果栈顶元素为正数,直接与字符做除法,结果入栈
  4. 扫描完数组之后,遍历栈(javascript中的数组)完成对所有元素的求和。

这里的第三步,对栈顶元素判断正负,是因为负数向下取整与正数向下正取之后的数字部分会相差1。比如 -3 / 2,向下取整之后是-2,而正数3 / 2向下取整是1。这道题中的负数是因为正数的-运算转成了负数的+运算,这样做的好处是避免在stack中存储运算符,从而避免在弹出时还要对栈顶元素是否是+ -运算符的判断。

function calculate(s: string): number {
  const stack: number[] = []
  const len = s.length
  let i = 0
  // 第一位是非负整数
  let op = '+'
  while (i < len) {
    if (['+', '-', '*', '/'].indexOf(s[i]) > -1) {
      op = s[i]
      i++
    } else {
      let num = ''
      // 收集数字,可以是多位数
      while (i < len && ['+', '-', '*', '/'].indexOf(s[i]) === -1) {
        num += s[i]
        i++
      }
      switch (op) {
        case '-':
          stack.push(-num)
          break
        case '+':
          stack.push(+num)
          break
        case '*':
          stack.push(stack.pop() as number * +num)
          break
        case '/':
          const top = stack.pop() as number
          stack.push(
            top < 0 ? -Math.floor(-top / +num) : Math.floor(top / +num)
          )
          break
      }
    }
  }
  // 计算总和
  return stack.reduce((calc, cur) => {
    return (calc += cur)
  }, 0)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值