用两个栈来实现一个队列【刷题记录】

一、题目描述

用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。
队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。

示例:

输入: [“PSH1”,“PSH2”,“POP”,“POP”]
返回: 1,2
解析:
“PSH1”:代表将1插入队列尾部
“PSH2”:代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2

二、解题思路

借助先进后出规则模拟实现队列先进先出
1、当插入时,直接插入 stack1
2、当弹出时,当 stack2 不为空,弹出 stack2栈顶元素,如果 stack2 为空,将 stack1 中的全部数逐个出栈入栈 stack2,再弹出 stack2 栈顶元素
在这里插入图片描述

三、解题代码(python)

class Solution:
    def __init__(self):
        ##定义辅助栈stack1、stack2  
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        # write code here
        ##直接往stack1中push
        self.stack1.append(node)
    def pop(self):
        #pop操作分类:1)如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop; 2)如果stack2不为空,直接pop
        if self.stack2 == []:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()

总结:
push操作就直接往stack1中push;
pop操作需要分类一下:
1)如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop,
2)如果stack2不为空,直接pop就ok。

方法(二)判断入队时,stack1是否为空,决定是否直接压入栈。

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        ##定义辅助栈stack1、stack2         
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        ##入队时,判断栈stack1是否为空,如不为空,将元素压入stack1;如为空,先将stack2元素倒回stack1,再将新元素压入stack1
        if len(self.stack1) == 0:
            while len(self.stack2):
                self.stack1.append(self.stack2.pop())
        self.stack1.append(node)
    def pop(self):
        ##出队时,判断stack2是否为空,如不为空,则直接弹出顶元素;如为空,则将stack1的元素逐个“倒入”stack2,把stack1最后一个元素弹出并出队。 
        if not len(self.stack2) == 0:
            return self.stack2.pop()
        else:
            while len(self.stack1) > 1:
                self.stack2.append(self.stack1.pop())
            return self.stack1.pop()

其中,
时间复杂度:push操作为O(1),pop操作为O(1)
空间复杂度:需要stack来存,O(n)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值