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

导读:本篇文章讲解 用两个栈来实现一个队列【刷题记录】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、题目描述

用两个栈来实现一个队列,分别完成在队列尾部插入整数(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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99778.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!