/**
* Runtime: 11 ms, faster than 27.64%
* Memory Usage: 41.5 MB, less than 13.36%
*/
class Solution {
public int calculate(String s) {
char[] sArr = s.toCharArray();
int sign = 1, res = 0; // sign用来记录符号(加上后面的项还是减去),最初默认为1;res表示到当前位置的计算结果
Deque<Integer> stack = new LinkedList<>(); // stack用来处理遇到括号的情况
for (int i = 0; i < sArr.length; i++) {
switch (sArr[i]) {
case ' ' : // 空格直接略过
break;
case '+' :
sign = 1;
break;
case '-' :
sign = -1;
break;
case '(' :
stack.push(res); // 将到目前为止的结果入栈
stack.push(sign); // 将刚刚读取的符号入栈
res = 0; // res重置为0,记录括号中的计算结果
sign = 1; // sign重置为1,括号中默认最开始是➕
break;
case ')' :
res = res * stack.pop() + stack.pop(); // 括号内容结束,将括号内的计算结果乘以它的系数(由它前面的加减操作符决定,在stack的栈顶),再加上括号之前的计算结果(stack的第二个元素)
break;
default :
int num = sArr[i] - '0'; // 当前字符对应的数字
while (i + 1 < sArr.length && Character.isDigit(sArr[i + 1])) { // 有可能是多位数,将这个数字完整读取
num = num * 10 + sArr[++i] - '0';
}
res += num * sign; // 累加到res
}
}
return res;
}
}