224. 基本计算器

142 阅读1分钟

给你一个字符串表达式 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) {
    // 定义栈内初始值 且栈内数值均为1
    const stack = [1];
    // 定义变量 默认为1 => 正数 -1 => 负数
    let sign = 1;
    let ret = 0;
    let i = 0
    let n = s.length
    while (i < n) {
        // 当遇到空时跳出
        if (s[i] === ' ') {
            i++
            continue
            // 当遇到 + 时 sign 为正数1
        } else if (s[i] == '+') {
            sign = stack[stack.length - 1]
            i++
            // 当遇到 - 时 sign 为负数1
        } else if (s[i] == '-') {
            sign = -stack[stack.length - 1]
            i++
        } else if (s[i] == '(') {
            stack.push(sign)
            i++
        } else if (s[i] == ')') {
            stack.pop()
            i++
        } else {
            let num = 0;
            // 此处循环为了防止非单数
            while (i < n && !(isNaN(Number(s[i]))) && s[i] !== ' ') {
                num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
                i++
            }
            ret += sign * num;
        }
    }
    return ret
};


来源:力扣(LeetCode)

链接:leetcode.cn/problems/ba…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。