给你一个字符串表达式?s
?,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如?eval()
?。
public class Solution {
public int calculate(String s) {
// 使用栈保存当前操作的符号
Deque<Integer> ops = new LinkedList<Integer>();
ops.push(1); // 初始符号为正号
int sign = 1; // 当前符号,默认为正号
int ret = 0; // 最终结果
int n = s.length();
int i = 0; // 当前处理的字符索引
while (i < n) {
if (s.charAt(i) == ' ') {
i++; // 跳过空格
} else if (s.charAt(i) == '+') {
sign = ops.peek(); // 更新当前符号为栈顶符号
i++;
} else if (s.charAt(i) == '-') {
sign = -ops.peek(); // 更新当前符号为栈顶符号的相反数
i++;
} else if (s.charAt(i) == '(') {
ops.push(sign); // 遇到左括号,将当前符号压入栈
i++;
} else if (s.charAt(i) == ')') {
ops.pop(); // 遇到右括号,弹出栈顶符号
i++;
} else {
// 处理数字字符
long num = 0;
while (i < n && Character.isDigit(s.charAt(i))) {
// 将连续的数字字符转换为整数值
num = num * 10 + s.charAt(i) - '0';
i++;
}
ret += sign * num; // 计算累加结果
}
}
return ret;
}
}