腾讯面试官:听说你在字节面试用栈实现队列,那怎么用队列实现栈呢?

引言

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

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

但是在学习过程中我也发现了一些问题,很多当时理解了并且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,怎么一个队列就能实现栈呢?其实很简单,还是需要我们写一个辅助方法,这个方法实现一个效果,把队列中的元素依次出队,然后再将出队的元素依次加到队尾,知道原本的队尾元素到了队首。这样的话,每当我们需要出栈时,只需要先执行一遍辅助函数,然后执行出队操作即可。

题解

ts 复制代码
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()
 */

总结

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

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

往期推荐✨✨✨

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

相关推荐
快去睡觉~16 小时前
力扣152:乘积最大子数组
算法·leetcode·职场和发展
程序员Xu16 小时前
【LeetCode热题100道笔记】二叉树的中序遍历
笔记·算法·leetcode
地平线开发者16 小时前
理想汽车智驾方案介绍 4 | World model + 强化学习重建自动驾驶交互环境
算法·自动驾驶
保卫大狮兄16 小时前
连锁零售企业如何能更有效地管理门店考勤?
面试·职场和发展
石氏是时试16 小时前
拉格朗日多项式
人工智能·算法·机器学习
薄荷糖__17 小时前
(二)模块化:ES Module使用原理,包管理工具npm
前端·面试
大模型真好玩17 小时前
大模型工程面试经典(五)—大模型专业领域微调数据集如何构建?
人工智能·python·面试
UrbanJazzerati17 小时前
Python正则表达式匹配和替换详细指南
python·面试
二哈不在线17 小时前
代码随想录二刷之“贪心算法”~GO
算法·贪心算法·golang
快去睡觉~17 小时前
力扣416:分割等和子集
数据结构·c++·算法·leetcode·职场和发展·动态规划