224. 基本计算器
解题思路
- 首先将输入的字符串转换为字符队列。
- 调用 helper() 方法,将字符队列作为参数进行计算。
- 在 helper() 方法中,创建一个栈来存储中间计算结果,初始化符号为 ‘+’,初始化数字为 0。
- 循环处理字符队列中的每个字符。
- 如果当前字符是数字,则将其与之前的数字组合成完整的数字。
- 如果遇到左括号,则开始递归计算括号内的表达式值。
- 如果当前字符不是数字且不是空格,或者队列已经为空,则说明遇到了一个完整的数字和一个符号,根据之前记录的符号对数字进行相应的操作,并将结果入栈。
- 如果遇到右括号,则结束当前递归并返回结果。
- 最后,计算栈中所有元素的和作为最终结果,并返回。
class Solution {
public int calculate(String s) {
Queue<Character> queueS = new LinkedList<>();
for(char c:s.toCharArray()){
queueS.add(c);
}
return helper(queueS);
}
private int helper(Queue<Character> s){
Stack<Integer> stack = new Stack<Integer>();
char sign = '+';
int num = 0;
while(!s.isEmpty()){
char c = s.poll();
if(Character.isDigit(c)){
num = num * 10 + Character.getNumericValue(c);
}
if(c == '('){
num = helper(s);
}
if(!Character.isDigit(c) && c != ' ' || s.isEmpty()){
if(sign == '+'){
stack.push(num);
}else if(sign == '-'){
stack.push(-num);
}else if(sign == '*'){
stack.push(stack.pop() * num);
}else if(sign == '/'){
stack.push(stack.pop() / num);
}
num = 0;
sign = c;
}
if(c == ')'){
break;
}
}
int res = 0;
for(int i : stack){
res += i;
}
return res;
}
}