给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 105s由数字、'+'、'-'、'('、')'、和' '组成s表示一个有效的表达式- '+' 不能用作一元运算(例如, "+1" 和
"+(2 + 3)"无效) - '-' 可以用作一元运算(即 "-1" 和
"-(2 + 3)"是有效的) - 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
class Solution {
public int calculate(String s) {
Deque<Integer> ops = new LinkedList<Integer>();
ops.push(1); // 初始化一个操作数栈,初始值为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; // 返回最终计算结果
}
}
解题思路:
- 使用栈(ops)来存放符号。初始时,栈中放入一个1,表示初始的符号为正号。
- 使用变量sign来表示当前的符号,初始为1(正号)。
- 遍历输入的字符串s,根据不同的字符执行相应的操作:
- ’ ':跳过空格。
- ‘+’:更新sign为栈顶的符号。
- ‘-’:更新sign为栈顶符号的相反数。
- ‘(’:将当前符号入栈。
- ‘)’:弹出栈顶符号,表示当前括号内计算结束。
- 数字:连续读取数字,并根据当前sign进行计算,累加到结果ret中。
- 最终返回ret作为计算结果。

1164

被折叠的 条评论
为什么被折叠?



