python
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
if not self.stack:
self.stack.append((x, x))
else:
self.stack.append((x, min(x, self.stack[-1][1])))
def pop(self):
"""
:rtype: void
"""
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1][0]
解释
__init__
: 初始化一个空栈,这里使用列表self.stack
来存储栈元素。但不同于常规栈,这里的栈元素是一个元组(x, min_val)
,其中x
是压入栈的原始值,min_val
是到目前为止栈中的最小值。push
: 当压入一个新元素x
时,它首先检查栈是否为空。如果栈为空,则直接压入(x, x)
(因为此时x
就是最小值)。如果栈不为空,则压入(x, min(x, self.stack[-1][1]))
,其中self.stack[-1][1]
是栈顶元素对应的当前最小值。pop
: 弹出栈顶元素,即self.stack.pop()
。top
: 返回栈顶元素的原始值,即self.stack[-1][0]
。
举例
假设我们按照以下顺序对MinStack
进行操作:
- 初始化一个
MinStack
对象。 - 使用
push
方法压入元素3。 - 使用
push
方法压入元素2。 - 使用
push
方法压入元素5。 - 调用
top
方法查看栈顶元素(应返回5)。 - 调用
getMin
方法(注意:虽然原代码中没有getMin
方法,但根据类的设计,我们可以假设这个方法返回栈中的最小值,即返回self.stack[-1][1]
)。 - 使用
pop
方法弹出栈顶元素。 - 再次调用
top
方法查看栈顶元素(应返回2)。
下面是相应的Python代码示例(包括假设的getMin
方法):
python
class MinStack(object):
# ...(省略了已给出的__init__、push、pop和top方法)
def getMin(self):
"""
:rtype: int
"""
return self.stack[-1][1] if self.stack else None
# 使用示例
stack = MinStack()
stack.push(3)
stack.push(2)
stack.push(5)
print(stack.top()) # 输出: 5
print(stack.getMin()) # 输出: 2
stack.pop()
print(stack.top()) # 输出: 2