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