class Solution { public int calculate(String s) { // 预处理 s = s.replace(" ", ""); s = s.replace("(-", "(0-"); Deque<Integer> num = new LinkedList<>(); num.push(0); Deque<Character> ch = new LinkedList<>(); int index = 0; while (index < s.length()) { char cur = s.charAt(index); if (cur == '(') { ch.push(cur); } else if (cur == ')') { // 计算直到遇到左边的'(' while (ch.peek() != '(') { cal(num, ch); } // 弹出左边的'(' ch.pop(); } else if (cur == '+' || cur == '-') { if (ch.isEmpty() ||ch.peek() == '(') { ch.push(cur); } else { cal(num, ch); ch.push(cur); } } else { int curNum = 0; while (index < s.length() && Character.isDigit(s.charAt(index))) { curNum = 10 * curNum + (s.charAt(index) - '0'); ++index; } num.push(curNum); continue; } ++index; } while (!ch.isEmpty()) { cal(num, ch); } return num.peek(); } private void cal(Deque<Integer> num, Deque<Character> ch) { int num1 = num.pop(); int num2 = num.pop(); if (ch.peek() == '+') { num.push(num1 + num2); } else { num.push(num2 - num1); } ch.pop(); }}