設計一個有getMin功能的棧-python3

【題目】
  實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
【要求】
  1、 pop、push、getMin操作的時間複雜度都是O(1)。
  2.、設計的棧類型可以使用現成的棧結構
【解題思路】
    方法一:首先想到的是,獲取棧中的元素時肯定需要遍歷棧中的元素,那時間複雜度就是O(N),不符合題目要求的O(1)。此時考慮用兩個棧保持O(1)的複雜度,棧stackMin用來專門存儲最小值元素。例如,剛開始時,兩棧均爲空,如果來一個數num1,stackData與stackMin均進棧,之後再來一個數num2進棧的話,stackData直接進棧,對於stackMin來說,如果num2<num1,則stackMin進棧;如果num2>num1,則讓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]

​

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章