@(labuladong的算法小抄)[计算器]
leetcode 224. 基本计算器
题目描述
解题思路
参考:labuladong的算法小抄P328
class Solution {
public int calculate(String s) {
Queue<Character> q = new LinkedList<>();
/* 初始化队列,将字符串的表达式存到队列中 */
for (int i = 0; i < s.length(); i++) {
q.offer(s.charAt(i));
}
return calculate(q);
}
/* 计算队列q中表达式的值 */
private int calculate(Queue<Character> q) {
/* 将s中的每个数字和它前面对应的符号存入栈中,最后对栈求和 */
Stack<Integer> stk = new Stack<>();
/* 记录表达式中的每个数字 */
int num = 0;
/* 记录num前的符号,初始化为+ */
char sign = '+';
while (!q.isEmpty()) {
char c = q.poll();
/* 将一对括号内的表达式看成一个数字 */
/* 遇到左括号则开始递归,直到遇到右括号,计算括号内表达式的值,返回给num */
if (c == '(') {
num = calculate(q);
}
/* 如果是数字,则连续读取(因为有可能是458这种三位数) */
if (Character.isDigit(c)) {
num = num * 10 + (c - '0');
}
/* 如果不是数字,且不是空格,或者当队列空了,则需要将num拼接上它的符号入栈 */
if ((!Character.isDigit(c) && c != ' ') || q.isEmpty()) {
switch (sign) {
case '+':
stk.push(num);
break;
case '-':
stk.push(-num);
break;
}
/* 更新符号sign为当前指向的符号,并把num清零 */
sign = c;
num = 0;
}
/* 注意,右括号的处理要写在这里! */
/* 因为在遇到右括号需要退出时,要把右括号之前最后的num入栈 */
if (c == ')') break;
}
/* 将栈中的所有元素求和就是答案 */
int res = 0;
while (!stk.isEmpty()) {
res += stk.pop();
}
return res;
}
}