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 == '-' || cur == '*' || cur =='/') { while (!ch.isEmpty() && ch.peek() != '(') { // 将优先级高的全部进行计算 char pre = ch.peek(); if (compare(pre, cur)) { // pre的优先级高 cal(num, ch); } else { break; } } 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 boolean compare(char pre, char opt) { if (pre == '*' || pre == '/') return true; if ((pre == '+' || pre == '-') && (opt == '-' || opt == '+')) return true; return false; } 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 if (ch.peek() == '*') { num.push(num1 * num2); } else if (ch.peek() == '/') { num.push(num2 / num1); }else { num.push(num2 - num1); } ch.pop(); }}