引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

用栈实现队列

leetcode题目链接

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的标准操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

题目分析

本题考查对基本数据结构的理解,栈和队列。栈的特点是后进先出(LIFO),后面入栈的元素会被最先弹出来。而队列则是先进先出(FIFO),就像生活中的排队一样,先入队的人,最先出队。

本题让用队列来实现一个栈,和上一题刚好相反字节面试官:用栈给我实现一个队列😏😏😏。在上一个用栈实现队列的题目中,我们使用了一个辅助栈,构成一对栈,一个in栈,一个out栈,从而实现了模拟队列的效果。很多同学在本题可能也想着用两个队列来模拟栈,这样也可以实现,但是其实本题只需要一个队列就可以。队列是FIFI,栈是LIFO,怎么一个队列就能实现栈呢?其实很简单,还是需要我们写一个辅助方法,这个方法实现一个效果,把队列中的元素依次出队,然后再将出队的元素依次加到队尾,知道原本的队尾元素到了队首。这样的话,每当我们需要出栈时,只需要先执行一遍辅助函数,然后执行出队操作即可。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class MyStack {
private queue: number[];
constructor() {
this.queue = [];
}

push(x: number): void {
this.queue.push(x);
}

pop(): number {
this.tail2head();
return this.queue.shift();
}

top(): number {
this.tail2head();
const x = this.queue.shift();
this.queue.push(x);
return x;
}

empty(): boolean {
return this.queue.length === 0;
}

private tail2head() {
let len = this.queue.length;
while (--len) {
this.queue.push(this.queue.shift());
}
}
}

/**
* Your MyStack object will be instantiated and called as such:
* var obj = new MyStack()
* obj.push(x)
* var param_2 = obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.empty()
*/

总结

本题考查用队列来实现栈,是对基本数据结构特性的考查,题目较简单,注意处理好辅助函数即可。

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,一起学习前端知识,我们下期见!