【数据结构】详解环形队列

news2024/11/26 7:38:58

文章目录

  • 🌏引言
  • 🍀[循环队列](https://leetcode.cn/problems/design-circular-queue/description/)
    • 🐱‍👤题目描述
    • 🐱‍👓示例:
    • 🐱‍🐉提示
    • 🐱‍🏍思路解析:
      • 📌数组下标循环的小技巧
      • 📌区分空与满
      • 🚩创建队列
      • 🚩判断是否为满
      • 🚩检查循环队列是否为空
      • 🚩插入元素
      • 🚩删除元素
      • 🚩从队首获取元素
      • 🚩从队尾获取元素
      • 🚩完整代码:
  • ⭕总结

🌏引言

队列的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于队列的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
在这里插入图片描述

🍀循环队列

在这里插入图片描述

🐱‍👤题目描述

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

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

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

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

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

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

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

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

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

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

class MyCircularQueue {

    public MyCircularQueue(int k) {

    }
    
    public boolean enQueue(int value) {

    }
    
    public boolean deQueue() {

    }
    
    public int Front() {

    }
    
    public int Rear() {

    }
    
    public boolean isEmpty() {

    }
    
    public boolean isFull() {

    }
}

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue obj = new MyCircularQueue(k);
 * boolean param_1 = obj.enQueue(value);
 * boolean param_2 = obj.deQueue();
 * int param_3 = obj.Front();
 * int param_4 = obj.Rear();
 * boolean param_5 = obj.isEmpty();
 * boolean param_6 = obj.isFull();
 */

🐱‍👓示例:

在这里插入图片描述

🐱‍🐉提示

在这里插入图片描述

🐱‍🏍思路解析:

要解决循环队列的有如下几个难题:

  • 数组的下标如何实现循环

  • 如何判别数组是否满了

📌数组下标循环的小技巧

  1. 下标最后再往后(offset 小于 array.length): index = (index + offset) % array.length
  2. 下标最前再往前(offset 小于 array.length): index = (index + array.length - offset) % array.length
    在这里插入图片描述

📌区分空与满

有三个方法:

  1. 通过添加 size 属性记录

  2. 保留一个位置

  3. 使用标记

博主这里采用第二个方法,如下图所示:
在这里插入图片描述

🚩创建队列

由于我们需要浪费一个空间来判断是否为满,随意在构造方法时回多构造一个空间

代码实现如下:

    private int[] elem;
    private int front;//表示队列的头
    private int rear;//表示队列的尾
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];
    }

🚩判断是否为满

我们只需要判断队尾的下一个元素是否为队尾就好

由于队列是循环的,所以我们需要利用数组循环下标的技巧来找

代码实现如下:

    public boolean isFull() {
        return (rear+1)%elem.length == front;
    }

🚩检查循环队列是否为空

当队尾等于队头时

//检查循环队列是否为空。
    public boolean isEmpty() {
        return rear == front;
    }

🚩插入元素

做法如下:

  • 判断是否为满
  • 若为满。返回false
  • 若不为满,则在elem下标为rear处插入该元素
  • 队尾向后走一步,返回true;

代码实现如下:

    //向循环队列插入一个元素。如果成功插入则返回真
    public boolean enQueue(int value) {
        if(isFull() ) {
            return false;
        }
        elem[rear] = value;
        rear = (rear+1)%elem.length;
        return true;
    }

🚩删除元素

做法如下:

  • 判断是否为null
  • 若为null。返回false
  • 若不为null,队首向后走一步,返回true;

实现如下:

    //从循环队列中删除一个元素。如果成功删除则返回真。
    public boolean deQueue() {
        if(isEmpty() ) {
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }

🚩从队首获取元素

做法如下:

  • 如果队列为空,返回 -1
  • 不为空,返回数组elem下标为fornt的值

代码如下:

    //从队首获取元素。如果队列为空,返回 -1 。
    public int Front() {
        if(isEmpty() ) {
            return -1;
        }
        return elem[front];
    }

🚩从队尾获取元素

做法如下:

  • 如果队列为空,返回-1
  • 不为空,如果为队尾下标为1,返回下标为elem.length-1的元素
  • 下标不为1,返回数组下标为rear-1的值

代码如下:

    //从队尾获取元素。如果队列为空,返回 -1 。
    public int Rear() {
        if(isEmpty() ) {
            return -1;
        }
        if(rear == 0) {
            return elem[elem.length-1];
        }
        return elem[rear-1];
    }

🚩完整代码:

class MyCircularQueue {
    private int[] elem;
    private int front;//表示队列的头
    private int rear;//表示队列的尾
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];
    }
    //向循环队列插入一个元素。如果成功插入则返回真
    public boolean enQueue(int value) {
        if(isFull() ) {
            return false;
        }
        elem[rear] = value;
        rear = (rear+1)%elem.length;
        return true;
    }
    //从循环队列中删除一个元素。如果成功删除则返回真。
    public boolean deQueue() {
        if(isEmpty() ) {
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }
    //从队首获取元素。如果队列为空,返回 -1 。
    public int Front() {
        if(isEmpty() ) {
            return -1;
        }
        return elem[front];
    }
    //从队尾获取元素。如果队列为空,返回 -1 。
    public int Rear() {
        if(isEmpty() ) {
            return -1;
        }
        if(rear == 0) {
            return elem[elem.length-1];
        }
        return elem[rear-1];
    }
    //检查循环队列是否为空。
    public boolean isEmpty() {
        return rear == front;
    }
    //判断是否为满
    public boolean isFull() {
        return (rear+1)%elem.length == front;
    }
}

⭕总结

关于《【数据结构】详解环形队列》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像特征描述和人脸识别

CV_tutorial2 特征检测使用HOG实现行人检测Harris角点检测关键特征检测SIFT纹理特征 LBP算法 模板匹配人脸识别 特征检测 使用HOG实现行人检测 HOG方向梯度直方图 实现过程: 灰度化(为了去掉颜色、光照对形状的影响);采用Gamma校正法对输…

拉美市场,跨境电商的最后一片蓝海市场?真的值得入场吗?

拉美,是跨境卖家公认的蓝海市场,甚至经常被称为“跨境电商的最后一片蓝海市场”。那么拉美市场的前景究竟如何?现在真的是跨境卖家入场的最佳时机吗?接下来就一起来看一看吧! 拉美市场基本概况 1、消费潜力大&#x…

软件测试工程师必会技术:Python带你上手WebSocket

关于Socket那些事 Socket,即网络套接字,是双向通信通道的端点(是抽象的)。 套接字可以在一个进程内、同一台机器上的进程之间,或者在不同机器上的进程之间进行通信。 网络套接字可以通过多种不同的通道类型得以实现…

[ 云计算 | AWS ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南

文章目录 一、前言二、所需 Maven 依赖三、先决必要的几个条件信息四、创建客户端连接五、Amazon S3 存储桶操作5.1. 创建桶5.2. 列出桶 六、Amazon S3 对象操作6.1. 上传对象6.2. 列出对象6.3. 下载对象6.4. 复制、重命名和移动对象6.5. 删除对象6.6. 删除多个对象 七、文末总…

Linux 云服务器挂载数据盘

1、检查linux服务器磁盘情况 df -h 可以看到无磁盘挂载信息。 2、查看待挂载磁盘信息 fdisk -l 可以看到40G系统盘、50G数据盘(盘符:/dev/vdb) 3、对数据盘分区 fdisk /dev/vdb 根据提示,依次输入“n”,“p”“1…

ModaHub魔搭社区:向量数据库产业的现状与技术挑战

I. 向量数据库的崛起 什么是向量数据库 在过去的一段时间里,向量数据库逐渐在数据库领域崭露头角。那么,什么是向量数据库呢?简单来说,向量数据库是一种专门设计用来处理向量数据的数据库。这些向量数据可以是物理测量、机器学习模型输出、地理空间数据等。向量数据库使用…

归纳整理:开发多用户商城系统的关键细节

电子商务的迅速发展,越来越多的企业和商家选择开发多用户商城系统来进入线上商城市场。然而,在选择和开发多用户商城系统时,有一些关键的细节需要特别关注,以确保系统的顺利运行和用户的满意度。 一、安全性与数据保护 多用户商城…

浅析SAS协议:链路层

文章目录 概述原语通用原语连接管理原语连接通信原语 地址帧IDENTIFY地址帧OPEN地址帧 链路复位Link ResetHard ResetSATA的Link Reset 连接管理建立连接连接仲裁 流量控制SSP流控Credit Advance SMP流控 相关参考 概述 SAS链路层用于定义原语、地址帧以及连接相关的内容&…

和鲸冠名,全权支持!全国高校青年教师数据科学与商业分析案例教学竞赛成功举办

为推动数据科学与商业分析领域教学模式的创新,以赛促教,激发教师们的教学热情和创新能力,以赛促创,激发学生们的创新潜能和能动性,中国商业统计学会举办了首届“和鲸杯”全国高校青年教师数据科学与商业分析案例教学竞…

关于yarn安装时报“node“ is incompatible with this module的解决办法

前提: 在用vue写一个h5页面时,当在用yarn安装时,提示如下错误: The engine “node” is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >18. 解决办法 我是使用命令忽略错误&#xff1a…

设计模式中的关系

文章目录 一、依赖概念 二,关联概念 三、聚合概念 四、组合概念 五、实现概念 六、继承概念 图总结整体总结 一、依赖 概念 依赖是一种临时使用关系,代码层体现为作为参数。 具体体现:依赖者调用被依赖者的局部变量、参数、静态方法&#…

认识Mat容器

目录 1.什么是Mat类 2.Mat类能存储的数据 整数类型(有符号和无符号): 浮点数类型: 布尔类型: 3.Mat类的创建 1.利用矩阵宽、高和类型参数创建Mat类 2.利用矩陈Size(结构和数据类型参数创建Mat类 3.利用已有Mat…

c++ day6

1.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动…

RSA私钥解密操作

RSA私钥解密操作 一、背景二、操作三、常见问题3.1 invalid key format3.2 解密的数据太长3.3 Decryption error 一、背景 项目数据库中存放的敏感字段已使用rsa加密的方式,将内容加密成密文存放, 现在需要在使用的时候,使用私钥进行解密。 二、操作 …

无涯教程-Python机器学习 - AdaBoost函数

它是最成功的增强集成算法之一。该算法的主要关键在于它们对数据集中的赋予权重的方式。因此,在构建后续模型时,该算法无需过多关注。 在以下Python配方中,我们将通过使用Pima Indians糖尿病数据集上的 sklearn 的 AdaBoostClassifier 类来构建用于分类的Ada Boost集成模型。 …

【计算机基础】一文带你了解 Linux

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

【DevOps视频笔记】6 - 7. Jenkins 介绍 和 安装

一、Integrate 工具 二、Jenkins 介绍 1. Jenkins 最主要的工作 2. CI / CD 可以理解为: 2.1 CI 过程 2.2 CD 过程 三、Jenkins 安装 1. 安装准备工作 2. 安装 Jenkins Stage 1:拉取 jenkins 镜像 Stage 2:编写docker-compose.yml St…

Postgresql的一个bug_涉及归档和pg_wal

故障描述: 服务器ocmpgdbprod1,是流复制主节点,它的从节点是ocmpgdbprod2,两个节点的Postgresql数据库版本都是PostgreSQL 11.6,主节点ocmpgdbprod1配置了pg_wal归档,从节点ocmpgdbprod2没有配置pg_wal归档…

雅思作文复习

目录 我使用的词汇: 上升: 下降: 波动: 保持: 幅度 大变化: 小变化: 雅思评价标准改变 小作文一般花费20分钟,我觉得自己能在18分钟解决是最好 考生在雅思考试中的小作文&a…

kali的学习

网络配置 1.kali的网络设置 首先我们了解kali的网络设置 DHCP:动态主机配置协议 是一个局域网的协议 使用UDP 协议工作静态IP:用于大部分的中小型网络 通过网络管理员手动分配IP原理进程 /etc 系统大部分服务启动过程都要访问该目录 我们直接去看看…