栈与队列

栈与队列

Posted by Fans on September 17, 2021

栈和队列

两个栈实现一个队列

在这里插入图片描述

求解思路,使用两个栈来回倒—此处已经是优化后的

我们设一个栈A和一个栈B

  • 如果是进队操作——-对进A栈
  • 如果是退队操作——-检查B栈,如果B中有元素,则B出栈,如果B中没有元素,则将A中元素倒入B中

判断队列为空==两个栈都为空,返回-1

class CQueue(object):

    def __init__(self):
        self.stack1=[]
        self.stack2=[]

    def appendTail(self, value):
        """
        :type value: int
        :rtype: None
        """
        self.stack1.append(value)

    def deleteHead(self):
        """
        :rtype: int
        """
        if self.stack2!=[]:
            return self.stack2.pop()
        else:
            if self.stack1==[]:
                return -1
            else:
                while (self.stack1 !=[]):
                    self.stack2.append(self.stack1.pop())
                return self.stack2.pop()

实现O1的操作对一个栈实现取min操作

在这里插入图片描述

这里的top的操作就是取栈顶的元素输出,而pop的工作就是出栈,但是不用输出元素

在这里我们需要使用一个辅助栈保存绝对降序的保存,如:

在这里插入图片描述

因此入栈操作和出栈操作我们需要维护两个栈。

  • 因此 push操作: 我们需要对A入栈,然后判断B是否是空,为空则入B栈,非空则需要入比B栈顶元素小的元素,这里需要考虑小于等于,不然在pop操作的时候,会多删了一个相等的数。
  • pop操作: 我们先对A出栈,然后判断A出栈的元素是不是在B的栈顶,如果是则出栈
  • top:直接返回A的栈顶
  • min:直接返回B的栈顶,因为B的栈顶保存了当前绝对降序的数字

代码:

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.Stack1=[]
        self.Stack2=[]

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.Stack1.append(x)
        if self.Stack2==[]:
            self.Stack2.append(x)
        else:
            if x<=self.Stack2[-1]:
                self.Stack2.append(x)

    def pop(self):
        """
        :rtype: None
        """
        a=self.Stack1.pop()
        if a==self.Stack2[-1]:
            self.Stack2.pop()
            
    def top(self):
        """
        :rtype: int
        """
        return self.Stack1[-1]

    def min(self):
        """
        :rtype: int
        """
        return self.Stack2[-1]