Skip to content

力扣链接:224.基本计算器

难度:⭐⭐⭐

解题关键词:

解题思路:使用栈将每个括号前的符号都记录到栈中,在计算时,取出来栈顶的符号来计算。这里最重要的是,在计算括号中表达式时,如果遇到了+号,那么直接取栈顶的符号计算即可,如果是-号,那么要把栈顶的符号取反。

typescript
var calculate = function (s) {
  // 符号栈
  const ops = [1];
  // 表示当前的计算符号
  let sign = 1;

  // 结果
  let ret = 0;

  const n = s.length;
  let i = 0;
  while (i < n) {
    // 遇到空格字符,直接跳过
    if (s[i] === ' ') {
      i++;
    } else if (s[i] === '+') { // 遇到+号,取栈顶符号作为数字的符号
      sign = ops[ops.length - 1];
      i++;
    } else if (s[i] === '-') { // 遇到-号,将栈顶符号取反作为数字的符号
      sign = -ops[ops.length - 1];
      i++;
    } else if (s[i] === '(') { // 遇到左括号,将当前符号入栈
      ops.push(sign);
      i++;
    } else if (s[i] === ')') { // 遇到右括号,将栈顶元素出栈
      ops.pop();
      i++;
    } else {
      // 计算当前数字
      let num = 0;
      while (i < n && !(isNaN(Number(s[i]))) && s[i] !== ' ') {
        // charCodeAt 拿到的是 UTF-16 的码(都是整数),因为0、1、2...的码都是递增的,所以使用当前数字的码 - 0的码,就是当前的数字
        num = num * 10 + s[i].charCodeAt(0) - '0'.charCodeAt(0);
        i++;
      }

      // 加上当前的数字
      ret += sign * num;
    }
  }
  return ret;
};