「LeetCode系列」用栈实现队列问题|刷题打卡

106 阅读2分钟

作者:看那个码农

公众号:看那个码农

本题来源于「LeetCode系列」232. 用栈实现队列

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作

(push、pop、peek、empty):

实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
示例如下:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (最左边的数字在队列前面)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

代码分析

由题目描述可知

栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于:

栈stack:后进先出

image.png

队列queue:先进先出

image.png

由于此题要求

用两个先进后出的栈实现一个先进先出的队列

我们可以将

一个栈当作输入栈,用于压入push传入的数据;

另外一个栈做为输出栈用于pop和peek操作;

image.png

如下图所示,

向输入栈push元素1,即代表向队列从右到左输入1

image.png

向输入栈push元素2,即代表向队列从右到左输入2

image.png

每次需要执行pop或peek之前,输入栈需要向输出栈移入元素,根据栈先进后出的原则,输出栈最先进入栈的元素是2,最后进入栈的元素是1

image.png

执行peek操作时,需要返回队列开头的元素,即返回在输出栈最上面的元素1

image.png

执行pop操作时,需要先从队列移除开头元素,再返回队列剩下的元素,即输出栈上面的元素1出栈,也就是代表队列中开头元素1从左边出列,此时队列只剩下元素2

image.png

当执行empty操作时候,即判断输入栈和输出栈是否为空,若为空则返回true,如下所示,输入输出栈没有元素,则返回true

image.png

如下所示,输入输出栈还有元素2,则返回false

image.png

因此我们的代码为

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

    def push(self, x):
        self.stack1.append(x)

    def pop(self):
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()

    def peek(self):
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2[-1]

    def empty(self):
        return not self.stack1 and not self.stack2

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情