155.最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
构建两个栈
数据栈:一个用来存储数据的栈。
最小索引栈:另一个栈的每一位i,用来存储前i位(包括第i位)的最小数的索引。
getMin():取出最小值操作:返回最小索引栈的最后一位,即当前栈的最小值的索引。
python代码如下:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
初始化两个栈,
一个栈用来存储数据
另一个栈用来存储前i位最小值的索引
"""
self.stack = []
self.stackindex = []
def stack_empty(self):
"""
判断当前栈是否为空
"""
return len(self.stack) == 0
def push(self, x):
"""
:type x: int
:rtype: void
"""
if self.stack_empty():
self.stackindex.append(0) #如果数据栈为空,索引栈就应该添加索引0.即初始位置
else:
if x < self.stack[self.stackindex[-1]]:
self.stackindex.append(len(self.stackindex))#如果当前添加的数是更小的数,索引栈添加数据栈长度为新的最小值的索引
else:
self.stackindex.append(self.stackindex[-1])#如果不是更小的数,索引栈就添加此时索引栈的最后一位的值
self.stack.append(x)
def pop(self):
"""
:rtype: void
"""
if self.stack_empty():
raise Exception("under flow") #数据栈为空抛出下溢异常
else:
del(self.stackindex[-1]) #删除索引栈的最后一位
return self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.stack[self.stackindex[-1]] #数据栈最小值的索引保存在索引栈的最后一位