#-*-coding:utf-8-*- ''' 需求:寫一個棧,實現出棧、入棧、求最小值,時間復雜度為O(1) 思路:通過兩個棧實現,一個棧stack,一個輔助棧min_stack,記錄stack中的最小值 棧stack,元素正常push和pop操作 棧min_stack: 入棧(push): 第一次push,元素正常放入棧中; 之后每一次push的元素data(即棧頂元素 min_stack[top])都和棧頂元素的前一個元素(即 min_stack[top-1])進行比較 data < min_stack[top-1],則將data置為min_stack的棧頂 data >= min_stack[top-1],則將min_stack[top-1]置為min_stack的棧頂 出棧(pop): 輔助棧min_stack 在stack有pop的時候一並pop操作 如此,min_stack棧中的棧頂位置始終保存這stack棧中的最小值 ''' class Stack(object): def __init__(self, size=8): self.size = size self.stack = [] self.min_stack = [] self.top = -1 def set_size(self, size): if self.top >= size: raise Exception("StackWillOverFlow") self.size = size def isFull(self): return True if self.top == self.size - 1 else False def isNull(self): return True if self.top == -1 else False def push(self, data): if self.isFull(): raise Exception("Stack over flow") return self.top += 1 self.stack.append(data) #將棧的第一個元素賦給min_stack if self.top == 0: self.min_stack.append(data) #當stack push第二個元素后開始比較,使得 min_stack[top] 始終為當前棧中的最小元素 if self.top > 0: if data < self.min_stack[self.top-1]: self.min_stack.append(data) else: self.min_stack.append(self.min_stack[self.top-1]) def pop(self): if self.isNull(): raise Exception("Stack is Empty") return self.top -= 1 #stack pop的時候min_stack一並pop self.min_stack.pop() return self.stack.pop() def get_top(self): if self.isNull(): raise Exception("Stack is Empty") return return self.stack[self.top] def show(self): print self.stack # min_stack棧的棧頂元素記錄着當前棧的最小值 def get_min(self): if self.isNull(): raise Exception("Stack is Empty") return return self.min_stack[self.top] #test def Test(): a = Stack(10) a.push(11) a.push(12) a.push(13) a.push(10) a.push(9) a.push(8) a.push(15) a.push(16) a.show() print a.get_min() a.pop() a.show() print a.get_min() a.pop() a.show() print a.get_min() a.pop() a.show() print a.get_min() a.pop() a.show() print a.get_min() a.push(20) a.show() print a.get_min() a.push(1) a.show() print a.get_min() if __name__ == '__main__': Test()