1、设计一个有getMin功能的栈
题目:实现一个特殊的栈,在实现栈的基本功能基础上,再实现返回栈中最小元素的操作。
要求:(1)pop、push、getMin操作的时间复杂度都是O(1)。(2)设计的栈类型可以使用现成的栈结构。
2、思路:
使用两个栈,一个栈保存当前栈中的元素,记做stackData;一个栈保存最小值的栈,记做stackMin,栈顶数据为最小的数据。
两个栈使用方案:
push【压入数据】:
假设要压入数据 x ,先压入原始栈 stackData,
然后判断stackMin是否为空,如果空,直接将 x 也压入stackMin。
如果不为空,则将 x 和 stackMin 栈顶数据比较大小,
如果 x 较小或相等,则将其压入stackMin;
如果 x 较大,则不压。
pop【弹出数据】:
从原始栈 stackData先弹出元素,记为data,然后比较当前stackMin的栈顶元素和data相等还是不等,【原因是stackMin中元素肯定比data小或者相等】。如果不等,则不操作,如果相等,则将stackMin的栈顶元素弹出。
getMin【查询最小值】:
返回stackMin中的栈顶元素。
3、代码:
import queue class Stack(): def __init__(self): self.stack = queue.LifoQueue() self.stackMin = queue.LifoQueue() def pop(self): value = self.stack.get()
if self.stackMin.empty():
print("is empyty")
valueMin = self.stackMin.get() if value != self.stackMin.get(): self.stackMin.put(valueMin) def push(self,x): self.stack.put(x) if self.stackMin.empty(): self.stackMin.put(x) else: value = self.stackMin.get() if x <= value: self.stackMin.put(value) self.stackMin.put(x) else: self.stackMin.put(value) def getMin(self): value = self.stackMin.get() self.stackMin.put(value) return value a = Stack() a.push(1) a.push(3) a.push(0) a.push(9) a.pop() print(a.getMin())