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

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


摘要:

在 LeetCode 中,基本计算器 II 是一个经典的算法问题,它要求我们实现一个可以处理加、减、乘、除运算的简单计算器。本文将围绕栈这一数据结构,详细解析如何实现这一算法,并探讨其在解决复杂计算问题中的应用。

一、问题背景

基本计算器 II 的题目描述如下:

给定一个包含正整数、负整数、加号(+)、减号(-)、乘号()和除号(/)的字符串,编写一个算法来计算表达式的值。

示例:

输入:"-2+34-5"

输出:-14

解释:先进行乘法和除法运算,得到 "-2+12-5",然后进行加法和减法运算,得到最终结果 "-14"。

二、算法思路

要解决这个问题,我们可以使用栈来帮助我们处理运算符的优先级和顺序。以下是算法的基本思路:

1. 遍历输入的字符串,遇到数字时,将其转换为整数并压入栈中。

2. 遇到运算符时,根据运算符的优先级,处理栈中的运算符和数字。

3. 重复步骤 1 和 2,直到字符串遍历完成。

4. 处理栈中剩余的运算符和数字。

三、代码实现

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

python

class Solution:


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


stack = []


num = 0


sign = '+'



for i in range(len(s)):


if s[i].isdigit():


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


if s[i] in '+-/' or i == len(s) - 1:


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


sign = s[i]


if i == len(s) - 1 or s[i] in '+-/':


if sign == '+':


stack.append(num)


elif sign == '-':


stack.append(-num)


elif sign == '':


stack.append(stack.pop() num)


elif sign == '/':


stack.append(int(stack.pop() / num))


num = 0



return sum(stack)

测试代码


sol = Solution()


print(sol.calculate("-2+34-5")) 输出:-14


四、算法分析

1. 时间复杂度:O(n),其中 n 是输入字符串的长度。我们只需要遍历一次字符串。

2. 空间复杂度:O(n),在最坏的情况下,栈中可能存储所有的数字和运算符。

五、总结

本文通过分析 LeetCode 中的基本计算器 II 问题,详细介绍了如何使用栈这一数据结构来解决具有优先级和顺序的运算问题。通过理解栈的原理和应用,我们可以更好地处理类似的问题,提高编程能力。

在实际应用中,栈是一种非常强大的工具,它可以帮助我们处理各种问题,如括号匹配、逆波兰表达式计算、后缀表达式计算等。通过学习栈的应用,我们可以更好地理解算法和数据结构,为解决更复杂的问题打下坚实的基础。