数据结构与算法之 leetcode 栈基本计算器 II 处理乘除优先级

数据结构与算法阿木 发布于 2 天前 1 次阅读


栈基本计算器 II:处理乘除优先级

在编程的世界里,算法和数据结构是解决问题的基石。LeetCode 是一个广受欢迎的在线编程平台,它提供了大量的编程题目,旨在帮助程序员提升算法和数据结构的能力。其中,“栈基本计算器 II”是一道经典的算法题,它要求我们实现一个计算器,能够处理包含加减乘除运算的字符串表达式,并正确处理乘除运算的优先级。

问题分析

题目要求我们实现一个计算器,能够计算一个包含数字、加号(+)、减号(-)、乘号()和除号(/)的字符串表达式的值。需要注意的是,乘号和除号具有高于加号和减号的优先级,这意味着在进行加法和减法运算之前,必须先完成乘法和除法运算。

解题思路

为了解决这个问题,我们可以使用两个栈:一个用于存储数字,另一个用于存储运算符。以下是解题的基本步骤:

1. 遍历输入的字符串表达式。

2. 遇到数字时,将其转换为整数并压入数字栈。

3. 遇到运算符时,根据运算符的类型和优先级进行处理:

- 如果当前运算符的优先级高于栈顶运算符的优先级,或者栈为空,则将当前运算符压入运算符栈。

- 否则,从数字栈中弹出两个数字,从运算符栈中弹出栈顶运算符,执行运算,并将结果压回数字栈。

4. 遍历完整个表达式后,如果运算符栈不为空,则继续执行步骤 3。

5. 数字栈中的栈顶元素即为表达式的结果。

代码实现

下面是使用 Python 实现的栈基本计算器 II 的代码:

python

class Solution:


def calculate(self, s: str) -> int:


def precedence(op: str) -> int:


if op in ('+', '-'):


return 1


if op in ('', '/'):


return 2


return 0

def apply_operator(a: int, b: int, op: str) -> int:


if op == '+':


return a + b


if op == '-':


return a - b


if op == '':


return a b


if op == '/':


return a // b

nums = []


ops = []


i = 0


while i < len(s):


if s[i].isdigit():


num = 0


while i < len(s) and s[i].isdigit():


num = num 10 + int(s[i])


i += 1


nums.append(num)


continue


if s[i] in '+-/':


while (ops and precedence(ops[-1]) >= precedence(s[i])):


nums.append(apply_operator(nums.pop(), nums.pop(), ops.pop()))


ops.append(s[i])


i += 1

while ops:


nums.append(apply_operator(nums.pop(), nums.pop(), ops.pop()))

return nums[-1]


总结

通过以上代码,我们实现了一个能够处理乘除优先级的计算器。这个计算器利用了栈的数据结构来存储数字和运算符,并通过比较运算符的优先级来决定何时执行运算。这种方法不仅能够处理乘除运算的优先级,还能够处理括号等更复杂的表达式。

在解决这类问题时,理解数据结构和算法的原理至关重要。通过不断地练习和思考,我们可以提高自己的编程能力,更好地应对各种算法挑战。