基本计算器leetcode224
时间: 2025-01-11 20:43:59 浏览: 42
### LeetCode 224 Basic Calculator 解答与解析
#### 表达式求值的核心挑战
表达式求值的关键在于处理括号和运算符优先级。对于给定的有效简单表达式字符串,目标是在不使用内置 `eval` 函数的情况下计算其结果[^1]。
#### 使用栈实现解决方案
为了应对这一挑战,可以采用栈来辅助完成操作数和运算符的管理:
- **初始化变量**
- 创建两个栈分别用于存储数字 (`numStack`) 和操作符 (`opStack`)
- 设置当前数值缓存器 `currentNum`
- **遍历输入串中的字符**
- 如果遇到的是数字,则更新 `currentNum`
- 若碰到加减号或右括号时,需将之前累积起来的操作数压入到 `numStack` 中,并重置 `currentNum`
- 当遇见左括号时直接跳过即可;而当碰见右括号则意味着要开始结算内部子表达式的值直到最近的一个未匹配的左括号位置为止
- **处理最终剩余项**
- 循环结束后可能还会有残留的数据存在于栈内或是暂存在 `currentNum` 变量里,因此最后一步是要把它们也加入到总的结果当中去
下面是具体的 Python 实现方式:
```python
def calculate(s: str) -> int:
num_stack = []
op_stack = []
current_num = 0
sign = '+'
for i, char in enumerate(s):
if char.isdigit():
current_num = current_num * 10 + int(char)
if (not char.isdigit() and not char.isspace()) or i == len(s)-1:
if sign == '-':
num_stack.append(-current_num)
elif sign == '+':
num_stack.append(current_num)
if char != ')':
sign = char
else:
temp_sum = 0
while isinstance(op_stack[-1], int):
temp_sum += op_stack.pop()
op_stack.pop() # pop out '('
num_stack.append(temp_sum)
current_num = 0
if char == '(':
op_stack.append(sign)
op_stack.append('(')
sign = '+'
return sum(num_stack) + sum([item for item in op_stack if isinstance(item, int)])
```
此方法通过巧妙利用栈结构解决了带有嵌套括号情况下的算术表达式求解问题,在时间复杂度上达到了 O(n),其中 n 是字符串长度[^3]。
阅读全文
相关推荐

















