设计循环队列(中等难度)

简介: 设计循环队列(中等难度)

题目概述(简单难度)

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。


循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。


你的实现应该支持如下操作:


MyCircularQueue(k): 构造器,设置队列长度为 k


Front: 从队首获取元素。如果队列为空,返回 -1 。


Rear: 获取队尾元素。如果队列为空,返回 -1 。


enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。


deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。


isEmpty(): 检查循环队列是否为空。


isFull():检查循环队列是否已满。

示例


MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3

circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回true circularQueue.enQueue(3); // 返回 true circularQueue.enQueue(4); // 返回 false,队列已满

circularQueue.Rear(); // 返回 3

circularQueue.isFull(); // 返回 true circularQueue.deQueue(); // 返回true circularQueue.enQueue(4); // 返回 true circularQueue.Rear(); //返回 4


题目链接:

点我进入leetcode


思路与代码

思路展现

这道题目的思路我全部放到了我的这篇博客里:大家可以直接戳下面的链接进行跳转查看:

戳我戳我


代码示例

public class MyCircularQueue {
    private int front;
    //rear表示当前可以插入元素的数组的下标
    private int rear;
    private int[] elem;
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];
    }
    /**
     * 向循环队列插入一个元素。如果成功插入则返回真。
     *
     * @param value
     * @return
     */
    public boolean enQueue(int value) {
        //此时代表队列已满,无法再进行插入
        if (isFull()) {
            return false;
        }
        //放到数组的rear下标
        this.elem[this.rear] = value;
        //rear指针往后走,取余是为了循环起来
        this.rear = (this.rear + 1) % this.elem.length;
        return true;
    }
    public boolean deQueue() {
        if (isEmpty()) {
            return false;
        }
        //只需要挪动front这个下标就好了,取余是为了循环起来
        this.front = (this.front + 1) % this.elem.length;
        return true;
    }
    /**
     * 得到队头元素
     *
     * @return
     */
    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return this.elem[this.front];
    }
    /**
     * 得到队尾元素
     * 注意特殊情况
     *
     * @return
     */
    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        int index = -1;
        if (this.rear == 0) {
            index = this.elem.length - 1;
        } else {
            index = this.rear - 1;
        }
        return this.elem[index];
    }
    /**
     * 队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return this.rear == this.front;
    }
    /**
     * 队列是否为满
     *
     * @return
     */
    public boolean isFull() {
        return (this.rear + 1) % this.elem.length == this.front;
    }
}

注意此处的构造方法中构造循环队列底层数组的时候的大小的时候必须是k+1,不能为k,因为一旦是k的话,leetcode会报错:报错信息如下所示:

输入:


[“MyCircularQueue”,“enQueue”,“enQueue”,“enQueue”,“enQueue”,“Rear”,“isFull”,“deQueue”,“enQueue”,“Rear”]

[[3],[1],[2],[3],[4],[],[],[],[4],[]]


输出


[null,true,true,false,false,2,true,true,true,4]


预期结果


[null,true,true,true,false,3,true,true,true,4]


我们可以看到题目所给的测试用例中当插入2的时候我们的代码运行出来是false,题目想要的是true,到了再插入下一个3的时候,题目想要的是才是false,就说明此时循环队列的底层数组想要插入的元素是三个,但是假如此时我们的数组大小设置为k的话,只能插入2个元素,所以要想插入3个元素,初始化数组大小的时候必须的是k+1才可以.


总结

考察对于循环队列的掌握,非常经典的一道题目,大家可以细细品味.


相关文章
|
存储 关系型数据库 MySQL
分布式事务的隔离级别有哪些?
总的来说,理解和掌握分布式事务的隔离级别是设计和实现可靠分布式系统的重要基础,需要在保证数据一致性和系统性能之间进行权衡和取舍。你还可以进一步深入研究不同隔离级别的具体实现和应用案例,以便在实际应用中更好地进行决策和操作。
|
JavaScript 前端开发 算法
JavaScript实现网页关灯效果
JavaScript实现网页关灯效果
214 0
|
安全 网络协议 Shell
渗透测试工具用法技巧入门到进阶
零基础网盘 百度网盘-19****394的分享 新手入门过程 看完 后面有进阶过程 简单工具
449 0
|
8月前
|
人工智能 监控 安全
开源AI守护后厨——餐饮厨房视频安全系统的技术解析
餐饮厨房视频安全系统是一套融合开源AI技术与视频监控的智能化解决方案,涵盖实时检测、行为监测、数据分析、公众透明化及反馈闭环五大模块。系统通过YOLOv8、ResNet等算法实现后厨卫生与操作规范的精准监控,识别率达97%,问题响应时间缩短至秒级。同时支持后厨直播与监管对接,提升消费者信任和管理效率。其灵活开源的特点,为食品行业安全管理提供了高效、透明的新路径,未来可扩展至食品加工等领域。
690 0
|
8月前
|
自然语言处理 测试技术 Serverless
Qwen3开源发布:Think Deeper, Act Faster!社区推理、部署、微调、MCP调用实战教程来啦!
Qwen3开源发布:Think Deeper, Act Faster!社区推理、部署、微调、MCP调用实战教程来啦!
1987 22
|
负载均衡 算法 网络安全
阿里云WoSign SSL证书申请指南_沃通SSL技术文档
阿里云平台WoSign品牌SSL证书是由阿里云合作伙伴沃通CA提供,上线阿里云平台以来,成为阿里云平台热销的国产品牌证书产品,用户在阿里云平台https://www.aliyun.com/product/cas 可直接下单购买WoSign SSL证书,快捷部署到阿里云产品中。
2726 8
阿里云WoSign SSL证书申请指南_沃通SSL技术文档
|
数据采集 数据可视化 关系型数据库
基于Python flask MySQL的穷游网酒店数据采集与可视化大屏
本文介绍了一个基于Python Flask和MySQL的穷游网酒店数据采集与可视化大屏项目,该项目实现了酒店数据的采集、存储和前端可视化展示,使用户能够直观了解酒店数据分布和价格趋势。
253 1
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
157 4
|
缓存 安全 Java
【揭秘】String vs StringBuilder vs StringBuffer:三大字符串类的秘密较量!你真的知道何时该用哪个吗?
【8月更文挑战第19天】探讨Java中`String`、`StringBuilder`与`StringBuffer`的区别及应用场景。`String`不可变,适合做哈希表键或多线程共享。`StringBuilder`支持动态修改字符串,适用于单线程环境以提高性能。`StringBuffer`与`StringBuilder`功能相似,但线程安全。示例代码展示各类型的基本用法。选择哪种类型取决于具体需求和性能考量。
231 0
|
机器学习/深度学习 计算机视觉
10 协方差矩阵与主成成分分析
10 协方差矩阵与主成成分分析
371 0