设计一个有getMin功能的栈-python3

【题目】
  实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
  1、 pop、push、getMin操作的时间复杂度都是O(1)。
  2.、设计的栈类型可以使用现成的栈结构
【解题思路】
    方法一:首先想到的是,获取栈中的元素时肯定需要遍历栈中的元素,那时间复杂度就是O(N),不符合题目要求的O(1)。此时考虑用两个栈保持O(1)的复杂度,栈stackMin用来专门存储最小值元素。例如,刚开始时,两栈均为空,如果来一个数num1,stackData与stackMin均进栈,之后再来一个数num2进栈的话,stackData直接进栈,对于stackMin来说,如果num2num1,则让stackMin的栈顶元素再一次进栈。对于pop,每次两个栈均弹出栈顶元素即可。很明显,每次stackMin均弹出的是栈stackData内的最小值。

         方法二与方法一类似。

        

    题目要求设计的栈类型可以使用现成的栈结构,在python中我们使用列表实现。

代码:(python3)

​
class Stack1(object):
    def __init__(self):
        self.stackData=[]
        self.stackMin=[]
    def push(self,num):
        self.stackData.append(num)
        if len(self.stackMin)==0 or num<=self.getMin():
            self.stackMin.append(num)
        else:
            self.stackMin.append(self.getMin())
    def pop(self):
        if len(self.stackData)==0:
            raise Exception("stack is empty")
        self.stackMin.pop()
        return self.stackData.pop()
    def getMin(self):
        if len(self.stackMin)==0:
            raise Exception("stack is empty")
        return self.stackMin[-1]
class Stack2(object):
    def __init__(self):
        self.stackData=[]
        self.stackMin=[]
    def push(self,num):
        self.stackData.append(num)
        if len(self.stackMin)==0 or num<=self.getMin():
            self.stackMin.append(num)
    def pop(self):
        if len(self.stackData)==0:
            raise Exception("stack is empty")
        value=self.stackData.pop()
        if self.getMin()==value:
            self.stackMin.pop()
        return value
    def getMin(self):
        if len(self.stackMin)==0:
            raise Exception("stack is empty")
        return self.stackMin[-1]

​

 

你可能感兴趣的:(python)