155.最小栈

设计一个有getMin功能的栈

要求:pop、push、getMin操作的时间复杂度都是O(1),设计时可以使用现成的栈结构

思路:使用两个栈,一个栈stackData用来保存当前栈中的元素,和普通栈没区别,另一个栈stackMin用于保存每一步的最小值。

(1)压入数据规则

如果当前数据为newNum,先将其压入stackData。然后判断stackMin是否为空:

  • 如果为空,则newNum也压入stackMin
  • 否则,比较nuwNum和stackMin栈顶元素哪一个更小
    • 如果newNum更小或者两者相等,则newNum也压入stackMin
    • 否则stackMin不压入任何内容

(2)弹出数据规则

先在stackData中弹出栈顶元素,记为value。value等于stackMin的栈顶元素时,弹出该栈顶元素,否则不弹出栈顶元素,返回value。

class MinStack(object):

    def __init__(self):
        self.stackData = []
        self.stackMin = []
        

    def push(self, x):
        self.stackData.append(x)
        if len(self.stackMin) == 0 or x<=self.getMin():
            self.stackMin.append(x)

    def pop(self):
        if len(self.stackData) == 0:
            return
        value = self.stackData.pop()
        if value == self.stackMin[-1]:
            self.stackMin.pop()
        return value
        

    def top(self):
        if len(self.stackData) == 0:
            return
        return self.stackData[-1]
        

    def getMin(self):
        if len(self.stackMin) == 0:
            return
        return self.stackMin[-1]

你可能感兴趣的:(155.最小栈)