面试题30:包含min函数的栈

 

 

思路:

1.首先将栈的基本结构写出

#初始化栈的写法
def __init__(self):
    self.stack = []

#栈的压入  (加self是实例化,如果前面加入静态装饰器啥的,就不需要加入self)
def push(self,node):
    self.stack.append(node)

#栈的弹出
def pop(self):
    #pop需要return
    if self.stack:
        return self.stack.pop()    
    return None

#栈顶元素

def top(self):
    return self.stack[-1]

 

2. 需要用空间换时间,来构造一个辅助栈(与原栈长度相同)存放小的元素;当然我程序中采用的是第二种思路,辅助栈的长度不一定等于原栈,这个时候需要在弹出是判断是否弹出

 

每次压入栈的一个元素,就记录一个当前的最小元素

每次弹出栈的一个元素,就连带着辅助栈的元素一起弹出

 实现以上思路:

 

# -*- coding:utf-8 -*-
class Solution:
  #为了时间复杂度为O(n)的指标,需要牺牲空间复杂度,我们建立一个栈(和原来栈长度一致)来做辅助存储最小元素 def __init__(self): self.stack = [] self.minStack = [] def push(self, node): # write code here self.stack.append(node) if self.minStack: if self.minStack[-1] > node: self.minStack.append(node) else: self.minStack.append(self.minStack[-1]) else: self.minStack.append(node) def pop(self): # write code here if self.stack: self.minStack.pop() return self.stack.pop() return None def top(self): # write code here if self.stack: return self.stack[-1] return None def min(self): # write code here if self.minStack: return self.minStack[-1] return None

  我们还可以对上面的思路变形,也就是构造辅助栈时,辅助栈只存储当前最小元素,长度<=原来栈的长度,也就是上面的4只存储一遍

# -*- coding:utf-8 -*-
class Solution:
    # 首先将栈的基本功能实现
    def __init__(self):
        self.stackA = []
        self.minStack = []
    def push(self, node):
        # write code here
        self.stackA.append(node)
        if self.minStack:
            if self.minStack[-1] > node:
                self.minStack.append(node)
        else:
            self.minStack.append(node)
    def pop(self):
        # write code here
        if self.stackA:
            if self.stackA[-1] == self.minStack[-1]:
                self.minStack.pop()
            return self.stackA.pop()  
        return None
    def top(self):
        # write code here
        if self.stackA:
            return self.stackA[-1]
        return None
    def min(self):
        # write code here
        if self.minStack == []:
            return None
        return self.minStack[-1]

  

posted @ 2019-08-05 10:37  lililili——  阅读(211)  评论(0)    收藏  举报