【数据结构趣味多】循环队列

news2024/11/16 10:30:19

目录

函数介绍及模拟实现

Front()函数

Rear()函数

enQueue()函数 

deQueue()函数

isEmpty()函数

isFull()函数

循环队列模拟题 


定义:把队列的头尾相连接的的顺序存储结构称为循环队列;循环队列的是由顺序表实现的。

为什么要使用循环队列?

        循环队列是由顺序表实现,也就是数组;我们还知道队列是尾进头出的,如果让数组头出,那么我们需要将后面的元素依次向前挪动,时间复杂度就高了。这是,我们的前辈就想到了循环数组,让数组头尾相连,这样就不用考虑挪动元素了。

函数介绍及模拟实现

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

Front()函数

 作用:从队首获取元素。

实现原理:先判断队列是否为空,不是空就返回front下标的元素,否则返回-1。

public int Front() {
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }

Rear()函数

作用:获取队尾元素。

实现原理:因为是循环队列,所以队尾比较难判断。我们分两种情况,因为我们判断循环队列是否满,运用的是牺牲一个空间来判断,因此,当rear的值是0时,正好他在数组开头,我们所需的值就是,数组最后一个下标的值,我们只需让数组长度减一;若不是数组头,我们仅让rear减一即可。

 public int Rear() {
        if(isEmpty()){
            return -1;
        }
        int index=(rear==0)?(elem.length-1):(rear-1);
        return elem[index];
    }

enQueue()函数 

作用:向循环队列插入一个元素。如果成功插入则返回真。

实现原理:判断队列是否满,满的话,就插不了,直接返回false;若不空,将rear下标的数数组值改成value,这里rear不能直接加一,因为rear如果一直加,就会超出数组的长度,导致数组下标越界异常,我们需要对其进行操作,让rear加一,再模上数组长度,就不会超过数组的下标范围了。

public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        elem[rear]=value;
        rear=(rear+1)%elem.length;
        return true;
    }

deQueue()函数

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

实现原理:enQueue()函数 函数相似

public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front=(front+1)%elem.length;
        return true;
    }

isEmpty()函数

作用:检查循环队列是否为空

实现原理:若头尾相等就是空

 public boolean isEmpty() {
        return front==rear;
    }

isFull()函数

作用:检查循环队列是否为满

实现原理:这里体现了对牺牲一个空间来判断是否满;我们让rear向前走一步,如果rear模上数组长度,等于front,那就是满了。

 

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

循环队列模拟题 

循环队列例题icon-default.png?t=MBR7https://leetcode.cn/problems/design-circular-queue/description/ 

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

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

相关文章

Android MVVM之SavedStateHandle数据保存之详解与使用。

一、介绍 SavedStateHandle从名字可以看出,是保存状态的。这个类常和MVVM中的ViewModel搭配使用,对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点,保存的数据类型也比较丰富&#xff0c…

算法刷题打卡第60天:回文链表

回文链表 难度:简单 给定一个链表的 头节点 head ,请判断其是否为回文链表。 如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 示例 1: 输入: head [1,2,3,3,2,1] 输出: true示例 2: 输入:…

文本摘要,基于Pytorch和Hugging Face Transformers构建示例,有源码

​ 文本摘要的常见问题和解决方法概述,以及使用Hugging Face Transformers库构建基于新浪微博数据集的文本摘要示例。 作 者丨程旭源 学习笔记 1 前言简介 文本摘要旨在将文本或文本集合转换为包含关键信息的简短文本。主流方法有两种类型,抽取式和生…

Nodejs模块的封装(数据库Mysql)

文章目录项目结构本次演示需要使用的第三方包为1.app.js相关配置2.router下的user.js相关配置3.db/index.js文件相关操作4.router_handler下的user.js相关操作项目结构 后面的项目相关文件的创建步骤按照我写的博客从上往下一步一步来 本次演示需要使用的第三方包为 "cor…

【操作系统实验/Golang】实验4:虚拟内存页面置换算法

目录 1 实验问题描述 2 测试数据 3 流程图 4 实验结果 4 实验代码 1 实验问题描述 设计程序模拟先进先出FIFO,最佳置换OPT和最近最久未使用LRU页面置换算法的工作过程。 假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个…

【Leetcode面试常见题目题解】1. 两数相加

题目描述 本文是leetcode第2题的题解,题目描述摘自leetcode。如下 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个…

海外服务器提供商选择中存在哪些风险?

开展海外业务时,毫无疑问,选择一个高质量的海外服务器提供商可以省去不少麻烦。但是,同时有一些海外服务商需要避开。毕竟一个服务器不靠谱,这跟提供商有很大的原因。下面主要是关于低于标准的海外服务器提供商的一些潜在风险。 1…

ES6中字符串和数组新增的方法

ES6中字符串和数组新增的方法一、字符串中新增的方法1、模板字符串 (表达式、函数的调用、变量)2、repeat(次数)函数 : 将目标字符串重复N次,返回一个新的字符串,不影响目标字符串3、includes()函数 :判断字符串中是否含有指定的子字符串,返回…

mysql 8 新旧密码可以同时生效

在MySQL8.0以前版本,给MySQL更改密码,明确写到开发规范中,拒绝更在线更改更密码,因为在8.0以前操作非常麻烦且不太完美。 MySQL 8.0之前的处理方法: 1. 创建一个同样权限的帐号通过 show grants for ‘user_name’1…

通用vue编辑按钮和新建按钮事件逻辑

一、编辑按钮对话框 1.首先先创建一个文件夹page-model,在里面使用elemengt-plus提供的对话框组件el-dialog。 2.在page-model里面去使用之前封装好的form表单,就是之前封装好的搜索组件的hy-form 3.在form组件里面加一个插槽,对应 page-m…

微信小程序:会议OA项目-首页

目录 一、flex布局 Flex布局简介 什么是flex布局? flex属性 flex的属性 二、轮播图组件及mockjs的使用 三、会议OA小程序首页布局 一、flex布局 Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float…

CompletableFuture详解

CompletableFuture详解 概要 RunnableThread虽然提供了多线程的能力但是没有返回值。CallableThread的方法提供多线程和返回值的能力但是在获取返回值的时候会阻塞主线程。 上述的情况只适合不关心返回值,只要提交的Task执行了就可以。另外的就是能够容忍等待。 C…

Java并发容器

一、并发容器总结1、大部分在 java.util.concurrent 包中。ConcurrentHashMap: 线程安全的HashMapCopyOnWriteArrayList: 线程安全的List,在读多写少的场合性能非常好,远远好于Vector.ConcurrentLinkedQueue: 高效的并发队列,使用链表实现。可…

[ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋

0 引出 数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在 回顾:二叉搜索树 左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势,因为每次还需要…

第四十二章 动态规划——数字三角形模型

第四十二章 动态规划——数字三角形模型一、数字三角形模型1、什么是数字三角形模型二、例题1、AcWing 1015. 摘花生(1)问题(2)思路状态表示状态转移循环设计初末状态(3)代码2、AcWing 1018. 最低通行费&am…

第二章:感知机

文章目录2.1感知机模型2.2感知机策略2.3梯度下降法2.4感知机-原始算法形式2.5感知机-原始算法实例2.6感知机-对偶形式2.7感知机-对偶形式实例2.8感知机算法收敛性证明如下:2.1感知机模型 2.2感知机策略 损失函数非负,策略是选择使其最小的模型参数 2.3梯…

【Linux工具】-gcc/g++

gcc/g一,简介二,代码的翻译过程1,预处理2,编译3,汇编4,链接(1)静态库(2)动态库(3)动静态库比较三,常见选项一,…

模板(C++)

模板(C)泛型编程函数模板概念格式原理实例化匹配原则类模板定义格式实例化泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& right) {int tmp left;left right;right tmp; }void Swap(double& left, doub…

【Spring6源码・IOC】BeanDefinition的加载

哎呀,又是午夜时分,又是一个失眠的夜晚,和去年一样,记得去年今日,也是睡不着觉,就注册了csdn的账号,开始写东西,csdn真是深夜最好的安魂剂。 Spring都发布了6.0,这不赶紧…

2022.12青少年软件编程(Python)等级考试试卷(三级)

2022.12.10青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,共50分) 1.列表L1中全是整数,小明想将其中所有奇数都增加1,偶数不变,于是编写了如下图所示的代码。 请问,图中红线处,代码应该是?(D) A. x || 2 B. x ^ 2 C. x && 2 D. x %…