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

引言

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

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

但是在学习过程中我也发现了一些问题,很多当时理解了并且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()
 */

总结

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

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

往期推荐✨✨✨

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

相关推荐
会唱歌的小黄李12 分钟前
【算法】贪心算法入门
算法·贪心算法
阳火锅28 分钟前
Vue 开发者的外挂工具:配置一个 JSON,自动造出一整套页面!
javascript·vue.js·面试
倔强青铜三44 分钟前
苦练Python第16天:Python模块与import魔法
人工智能·python·面试
轻语呢喃1 小时前
每日LeetCode : 两数相加--链表操作与进位的经典处理
javascript·算法
钢铁男儿1 小时前
C# 接口(接口可以继承接口)
java·算法·c#
Java技术小馆2 小时前
RPC vs RESTful架构选择背后的技术博弈
后端·面试·架构
zl_vslam2 小时前
SLAM中的非线性优化-2D图优化之激光SLAM cartographer前端匹配(十七)
前端·人工智能·算法
爱学习的茄子3 小时前
【踩坑实录】React Router从入门到精通:我的前端路由血泪史
前端·javascript·面试
Jackson_Mseven3 小时前
🎯 面试官:React 并发更新怎么调度的?我:Lane 就是调度界的 bitmap!
前端·react.js·面试
dying_man3 小时前
LeetCode--44.通配符匹配
算法·leetcode