LeetCode刷题记152
224. 基本计算器
class Solution {
public int calculate(String s) {
s = s.replaceAll(" ", "");
if (s.length() == 0) return 0;
Stack<Character> sta = new Stack<Character>();
for (int i = 0; i < s.length(); i ++) {
char ch = s.charAt(i);
if (ch == '(') {
sta.push(ch);
} else if (ch == ')') {
int cur = 0;
while (sta.peek() != '(') {
int num1 = 0;
String num1_s = "";
while (!sta.isEmpty() && Character.isDigit(sta.peek())) {
num1_s += sta.pop();
}
for (int j = num1_s.length() - 1; j >= 0; j --) {
num1 = num1 * 10 + num1_s.charAt(j) - '0';
}
while (!sta.isEmpty() && !Character.isDigit(sta.peek())) {
if (sta.peek() == '-') {
num1 = - num1;
sta.pop();
} else if (sta.peek() == '+') {
sta.pop();
} else break;
}
cur += num1;
}
sta.pop();
String tmp = "" + cur;
for (int j = 0; j < tmp.length(); j ++) {
sta.push(tmp.charAt(j));
}
} else {
sta.push(ch);
}
}
int ans = 0;
while (!sta.isEmpty()) {
int num1 = 0;
String num1_s = "";
while (!sta.isEmpty() && Character.isDigit(sta.peek())) {
num1_s += sta.pop();
}
for (int j = num1_s.length() - 1; j >= 0; j --) {
num1 = num1 * 10 + num1_s.charAt(j) - '0';
}
while (!sta.isEmpty() && !Character.isDigit(sta.peek())) {
if (sta.peek() == '-') {
num1 = - num1;
}
sta.pop();
}
ans += num1;
}
return ans;
}
}
这里我把计算好一个括号的数字又拆开来放回去了,比较方便。
第一遍while循环处理了有括号的情况,第二遍就是没有括号可以直接进行计算的式子。
注意一下,计算2-(1-2)的时候,经过第一遍循环,栈里面存储了2–1,有两个符号,所以对负号的处理也可以用一个循环。