基本计算器

07/16/2021

leetcode-基本计算器

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

输入:s = "1 + 1"
输出:2
示例 2:

输入:s = " 2-1 + 2 "
输出:3
示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 105
  • s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
  • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

本人题解

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
  s = s.split(' ').join('').split('');
  let stack = [{value: 0, c: '+', l: '+', n: ''}];
  function calc() {
    let curS = stack[stack.length-1]
    if (!!curS.n) {
      curS.value = curS.l == '+' ? curS.value + parseInt(curS.n) : curS.value - parseInt(curS.n)
    }
  }
  s.forEach((c, i) => {
    if (c == '(') {
      let curS = {value: 0, c: '+', l: '+', n: ''}
      if (s[i-1] == '-') {
        curS.c = '-'
      }
      stack.push(curS)
    } else if (c == ')') {
      calc()
      let curS = stack.pop()
      stack[stack.length-1].value = curS.c == '-' ? stack[stack.length-1].value - curS.value : stack[stack.length-1].value + curS.value
    } else if (c == '+' || c == '-') {
      calc()
      let curS = stack[stack.length-1]
      curS.l = c
      curS.n = ''
    } else {
      let curS = stack[stack.length-1]
      curS.n = curS.n + c
    }
  })
  calc()
  return stack[0].value
};

分析

忘了。以后再补