📅  最后修改于: 2023-12-03 14:49:54.051000             🧑  作者: Mango
动态堆栈是一种基于数组实现的数据结构,它具有栈的特性,即先进后出。与普通堆栈不同的是,动态堆栈支持在 O(1) 时间复杂度和 O(1) 额外空间内获取最小值。
为了实现动态堆栈,我们需要在每个元素中保存当前栈的最小值。为此,我们可以使用一个辅助数组来存储每个位置对应的最小值。
Stack 类表示一个堆栈对象,具有以下属性和方法:
stack
:用于存储堆栈的元素的数组min_stack
:用于存储堆栈的最小值的辅助数组push(item)
:将元素 item 入栈pop()
:从栈顶弹出并返回元素top()
:返回栈顶元素但不弹出getMin()
:返回堆栈的最小值class Stack:
def __init__(self):
self.stack = []
self.min_stack = []
def push(self, item):
self.stack.append(item)
if not self.min_stack or item <= self.min_stack[-1]:
self.min_stack.append(item)
def pop(self):
if self.stack:
item = self.stack.pop()
if item == self.min_stack[-1]:
self.min_stack.pop()
return item
def top(self):
if self.stack:
return self.stack[-1]
def getMin(self):
if self.min_stack:
return self.min_stack[-1]
stack = Stack()
stack.push(5)
stack.push(3)
stack.push(7)
print(stack.getMin()) # 输出 3
stack.pop()
print(stack.getMin()) # 输出 3
stack.push(2)
print(stack.getMin()) # 输出 2
以上代码会创建一个动态堆栈,并进行一些入栈、出栈操作,并输出最小值。
通过使用辅助数组来记录堆栈每一步的最小值,我们可以在 O(1) 时间复杂度内获取堆栈的最小值,同时在执行过程中只使用了 O(1) 的额外空间。这种设计可以在需要频繁获取堆栈最小值的场景中提供更高效的操作。