使用栈结构实现表达式求值
时间: 2024-05-12 13:16:34 浏览: 14
算法思路:
1. 创建两个栈:一个操作数栈和一个操作符栈。
2. 从左到右遍历表达式,遇到操作数就压入操作数栈,遇到操作符就与操作符栈中的栈顶元素比较优先级。
3. 如果当前操作符的优先级大于操作符栈顶的操作符优先级,就将当前操作符压入操作符栈。
4. 如果当前操作符的优先级小于或等于操作符栈顶的操作符优先级,就从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行计算并将结果压入操作数栈,重复步骤3,直到当前操作符的优先级大于操作符栈顶的操作符优先级。
5. 当遍历完表达式后,如果操作符栈中还有操作符,就将操作数栈中剩余的操作数和操作符栈中的操作符按照步骤4计算,直到操作符栈为空。
6. 操作数栈中最后剩下的元素就是表达式的值。
算法实现:
```python
def calculate(s: str) -> int:
# 定义操作符优先级
priority = {'+': 1, '-': 1, '*': 2, '/': 2}
# 定义操作数栈和操作符栈
nums = []
ops = []
i = 0
while i < len(s):
# 跳过空格
if s[i] == ' ':
i += 1
continue
# 如果是数字,压入操作数栈
if s[i].isdigit():
j = i
while j < len(s) and s[j].isdigit():
j += 1
nums.append(int(s[i:j]))
i = j
# 如果是操作符,比较优先级
else:
while ops and priority[ops[-1]] >= priority[s[i]]:
b = nums.pop()
a = nums.pop()
op = ops.pop()
if op == '+':
nums.append(a + b)
elif op == '-':
nums.append(a - b)
elif op == '*':
nums.append(a * b)
elif op == '/':
nums.append(int(a / b))
ops.append(s[i])
i += 1
# 处理剩余的操作符
while ops:
b = nums.pop()
a = nums.pop()
op = ops.pop()
if op == '+':
nums.append(a + b)
elif op == '-':
nums.append(a - b)
elif op == '*':
nums.append(a * b)
elif op == '/':
nums.append(int(a / b))
# 返回操作数栈中最后剩下的元素
return nums[-1]
```
算法分析:
1. 时间复杂度:遍历一遍表达式,时间复杂度为O(n);操作符栈和操作数栈中每个元素都只进出一次,所以总时间复杂度为O(n)。
2. 空间复杂度:操作符栈和操作数栈的最大长度为表达式的长度,所以空间复杂度为O(n)。
参考链接:
1. [LeetCode官方题解](https://leetcode-cn.com/problems/basic-calculator-ii/solution/jian-dan-zhan-jie-fa-by-jerry_nju/)
2. [算法珠玑(第2版)](https://book.douban.com/subject/33437322/)