栈和队列(1)

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())

猜你喜欢

转载自www.cnblogs.com/Lee-yl/p/9690351.html