class MinStack(object):
#辅助栈记录data栈里最小值的索引
mins = []
data = []
def push(self, num):
self.data.append(num)
if len(self.mins) == 0:
self.mins.append(0)
else:
min = self.getMin()
#如果新加入的数字小于data栈里的最小值,需要在辅助栈里面添加data栈新的最小值的索引
if min > num:
self.mins.append(len(self.data)- 1)
def pop(self):
if len(self.data) == 0:
raise Exception('栈为空')
else:
# 获取data栈顶元素索引
popIndex = len(self.data) - 1
#获取最小值的索引
minIndex = self.mins[len(self.mins) - 1]
#如果删除的data栈顶元素的索引 等于 辅助栈最小值的索引 则将该索引从辅助栈里删除。
if popIndex == minIndex:
self.mins.pop()
return self.data.pop()
def getMin(self):
if len(self.mins) == 0:
raise Exception('栈为空')
else:
return self.data[self.mins[len(self.mins) - 1]]
if __name__ == '__main__':
ms = MinStack()
ms.push(10)
ms.push(8)
ms.push(5)
ms.push(12)
ms.push(2)
ms.push(12)
ms.push(1)
ms.pop()
print(ms.getMin())
一
mins 0
data 10
二
mins 0 1
data 10 8
三
mins 0 1 2
data 10 8 5
四
mins 0 1 2
data 10 8 5 12
五
mins 0 1 2 4
data 10 8 5 12 2
六
mins 0 1 2 4
data 10 8 5 12 2 12
七
mins 0 1 2 4 6
data 10 8 5 12 2 12 1
八
mins 0 1 2 4
data 10 8 5 12 2 12