2021-09-17-栈和队列

栈和队列

两个栈实现一个队列

在这里插入图片描述
求解思路,使用两个栈来回倒—此处已经是优化后的

我们设一个栈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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值