返回轨道
算法 · 2026-05-14 · 22 阅读

P178 支持括号与加减法的计算器

算法 22 阅读

信号摘要

难度:Hard · 时长:19:37 · leetcode 224 · lintcode 978

P178 支持括号与加减法的计算器

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个字符串表达式,你要实现一个简易计算器,对它进行求值。

表达式中只包含非负整数、(、)、+、- 运算符以及空格。

注意,给出的表达式总是有效的,并且不允许使用内置的字符串求值函数。

比如说,给你的表达式为:

"2-(1 -(2 + 1)) "

这个表达式求值结果等于 4,因此你要返回 4。

相关视频:简易计算器

代码

public class AlgoCasts {

  // Time: O(n), Space: O(n)
  public int calculateTwoStack(String s) {
    int n = s.length();
    Stack<Integer> nums = new Stack<>();
    Stack<Character> ops = new Stack<>();
    ops.push('(');

    for (int i = 0; i <= n; ++i) {
      if (i == n || s.charAt(i) == ')') {
        int sum = 0, num = nums.pop();
        while (ops.peek() != '(') {
          if (ops.pop() == '-') num = -num;
          sum += num;
          num = nums.pop();
        }
        sum += num;
        nums.push(sum);
        ops.pop();
      } else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
        int num = s.charAt(i) - '0';
        while (i+1 < n && s.charAt(i+1) >= '0' && s.charAt(i+1) <= '9') {
          num = num * 10 + s.charAt(i+1) - '0';
          ++i;
        }
        nums.push(num);
      } else if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '(') {
        ops.push(s.charAt(i));
      }
    }
    return nums.peek();
  }

  // Time: O(n), Space: O(n)
  public int calculateOneStack(String s) {
    int sum = 0, op = 1, n = s.length();
    Stack<Integer> ops = new Stack<>();
    ops.push(1);

    for (int i = 0; i < n; ++i) {
      if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
        int num = s.charAt(i) - '0';
        while (i+1 < n && s.charAt(i+1) >= '0' && s.charAt(i+1) <= '9') {
          num = num * 10 + s.charAt(i+1) - '0';
          ++i;
        }
        sum += ops.peek() * op * num;
      } else if (s.charAt(i) == '(') {
        ops.push(ops.peek() * op);
        op = 1;
      } else if (s.charAt(i) == ')') ops.pop();
      else if (s.charAt(i) == '+') op = 1;
      else if (s.charAt(i) == '-') op = -1;
    }
    return sum;
  }

}

📡 通讯频道