循环队列的实现

文章目录

  • 循环队列的概念
  • 循环队列的实现
    • 循环队列的判空和判满
    • 链表or数组

循环队列的概念

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

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

循环队列的实现

首先我们需要明确循环队列需要实现的功能:

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

循环队列的判空和判满

对上述功能加以思考后我们就发现了循环队列和普通队列区分开来的一个难点:如何判断循环队列是空的还是满的。
以队列长度为4的循环队列举例,当我们刚刚创建队列时队头队尾的位置如下:
在这里插入图片描述

  • 此时我选择是将rear指向队尾的下一个数据,不难发现当循环队列为空的时候,front==rear;
    然后当我们enQueue 1,2,3,4;
    在这里插入图片描述
    这时我们尴尬地发现,front还是等于rear,也就是说我们不能通过front和rear的值来判断循环队列是空的还是满的。或者,当front等于rear时我们随机给出空和满中的一个答案。
    显然这个并不能算是解决方法的解决方法会导致循环队列的功能实现出BUG。
    因此,我又想出了以下两个解决方案
  • 首先,也是最容易想到的,直接在循环队列的结构体里面加上size来记录元素个数,那不就从根源上解决了问题了吗?
  • 其次,我们上述讨论front和rear不能判空和满,原因是空和满时,front和rear都是相等的。如果我们稍稍改变循环队列的长度,使得循环队列满的时候,front!=rear,那么问题不久迎刃而解了吗?事实上我们可以构建循环队列时申请k+1个空间,那么当rear的下一个是front,这时循环队列就是满的。
    接下来我以第一种方法来实现循环队列/=。

链表or数组

很多人看到循环队列时都会想到用循环链表来实现,诚然我也是这么想的,但随之问题接踵而至。譬如求队尾元素,时间复杂度为O(n),而用数组实现的话,时间复杂度为O(1).除此之外,销毁循环链表也是相较数组实现麻烦。
因此我这里考虑用数组来实现循环链表。

  • 首先我们优先实现循环链表的判空和判满:
typedef struct 
{int*arr;int front;int rear;int k;int size;
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->size==0;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return obj->size==obj->k;
}
  • 再在此基础上实现其他功能:
MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->rear=obj->front=obj->size=0;obj->k=k;obj->arr=(int*)malloc(k*sizeof(int));return obj;    
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if(myCircularQueueIsFull(obj))return false;obj->arr[obj->rear]=value;obj->size++;obj->rear=(obj->rear+1)%obj->k;return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return false;obj->front=(obj->front+1)%obj->k;obj->size--;return true;
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return -1;return obj->arr[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj))return -1;return obj->arr[(obj->rear-1+obj->k)%obj->k];
}
void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->arr);free(obj);
}

值得注意的是在上述代码实现过程中,我们巧妙地运用了取模的方式来简化了特殊情况的判断。这也是我们在实现循环队列时所能提升的能力之一。
以上便是本期文章的全部内容,希望大家都能有所收获。

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

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

相关文章

快速下载Huggingface的大语言模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Huggingface是什么?二、基于官方huggingface-cli下载(基础,断线风险)1.安装hf下载环境2.配置环境变量3.注册…

CSAPP-信息的表示和处理

文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.大端高位在前,小端低位在前 2.逻辑运算符(&& 、||、!)与位级运算(&、|、~)的差异 3.宏可以保证无论代码如何编译,都能生成…

flutterandroidx支持,【工作经验分享】

基于Linux的pc启动过程 我们都知道,所有的程序软件包括操作系统都是运行在内存中的,然而我们的操作系统一般是存放在硬盘上的,当我们按下开机键的时候,此时内存中什么程序也没有,因此需要借助某种方式,将操…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中,不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说,频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题,百度自动更新文章SEO工具应运而生,它能够帮助网站管…

搭建nginx+keepalived高可用(主备模式)

nginx安装 1. 前置依赖安装 yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2. 编译安装nginx nginx下载地址: https://nginx.org/en/download.html ## 安装包位置:信息港16.11:/root/shl tar xvf nginx-1.20.2.ta…

chartjs 饼状图

之前要把canvas先清除掉&#xff0c;不然刷新数据&#xff0c;还会有前面的图表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的&#xff1f; 数据的更新 前言 mvcc 与一个事物的隔离级别有关&#xff0c;未提交读永远读的是当前值&#xff0c;串行化是通过加锁实现&#xff0c;这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

vue+element ui上传图片到七牛云服务器

本来打算做一个全部都是前端完成的资源上传到七牛云的demo&#xff0c;但是需要获取token&#xff0c;经历了九九八十一难&#xff0c;最终还是选择放弃&#xff0c;token从后端获取&#xff08;springboot&#xff09;。如果你们有前端直接能解决的麻烦记得私我哦&#xff01;…

『Linux从入门到精通』第 ㉒ 期 - 动静态库

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;什么是库&#xff1f;&#x1f427;为什么要有库&#xff1f;&#x1f427;写一个自己的库&#x1f426;方法一&#x1f426;方法二 静态库&#x1f426;标准化&#x1f426;方法三 动态库&#x1f426;配置动…

python中自定义报错

class MyError(Exception):def __init__(self,num):#录入的数Exception.__init__(self)self.numnumdef __str__(self):return 这是我定义的第%d个异常 %(self.num)使用 try:raise MyError(4) except MyError as e:print(e)raise 其作用是指定抛出的异常名称&#xff0c;以及异常…

题目 1240: 生日日数

题目描述: CCC老师的生日是YY年MM月DD日&#xff0c;他想知道自己出生后第一万天纪念日的日期&#xff08;出生日算第0天&#xff09;。 代码: package lanqiao;import java.time.LocalDate; import java.util.*;public class Main {public static void main(String[] args)…

数据结构题目①——数组

前言 本篇文章为博主进行代码随想录——数组练习后的总结会涉及到每一道题目的详细的思路整理&#xff0c;以及本人的易错点&#xff0c;希望对大家有所帮助 数组介绍&#xff1a; 数组在C语言中就已经有所涉及&#xff0c;它是一个最基础的数据结构&#xff0c;而在数据结构中…

Java学习—FileInputStream

在Java编程中&#xff0c;文件操作是日常任务之一。无论是读取配置文件、处理图像&#xff0c;还是读写日志文件&#xff0c;理解如何有效地进行文件读取都是非常重要的。Java提供了多种方式来操作文件&#xff0c;而FileInputStream是其中最基础也是最直接的一种。本文将深入探…

Spring面试系列-01

1. 什么是 Spring 框架? Spring中文翻译过来是春天的意思,被称为J2EE的春天,是一个开源的轻量级的Java开发框架, 具有控制反转(IoC)和面向切面(AOP)两大核心。Java Spring框架通过声明式方式灵活地进行事务的管理,提高开发效率和质量。 Spring框架不仅限于服务器端的…

three 层级模型

group.remove(mesh1,mesh2);Vector3与模型位置、缩放属性 Group层级模型(树结构) 创建了两个网格模型mesh1、mesh2&#xff0c;通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象group的子对象&#xff0c;然后在通过执行scene.a…

jenkins部署maven项目

流程&#xff1a; jenkins从代码仓库读取代码&#xff0c;将代码文件放入jenkins的工作空间&#xff0c;将jenkins工作空间的代码进行打包&#xff0c;将jar包远程发送给服务器。 一&#xff1a;所需插件二&#xff1a;Tools 三&#xff1a;System&#xff1a; 配置ssh连接的…

github要求2fa身份验证

前言 github登陆的时候发现要求2fa验证, 2fa是啥?咋验证? 解决 2FA&#xff08;Two-Factor Authentication&#xff0c;双因素身份验证&#xff09; 就是在账户和密码的基础上增加一次验证码验证,这样即使密码被窃取,由于黑客没有你的验证码也无法登陆 就像是银行的u盾一样…

python63-Python的循环之循环使用else

Python的循环都可以定义else代码块&#xff0c;当循环条件为False 时&#xff0c;程序会执行else代码块。如下代码示范了为while循环定义else代码块。 # !/usr/bin/env python# -*- coding: utf-8 -*-# Time : 2024/01# Author : Laopicount_i 0while count_i < 5:print(c…

Java集合相关面试题(2024大厂高频面试题系列)

1、说一说Java提供的常见集合&#xff1f;&#xff08;画一下集合结构图&#xff09; 在java中提供了量大类的集合框架&#xff0c;主要分为两类&#xff1a; 第一个是Collection 属于单列集合&#xff0c;第二个是Map 属于双列集合 在Collection中有两个子接口List和Set。…

【力扣hot100】刷题笔记Day14

前言 又是新的一周&#xff0c;快乐的周一&#xff0c;快乐地刷题&#xff0c;今天把链表搞完再干活&#xff01; 114. 二叉树展开为链表 - 力扣&#xff08;LeetCode&#xff09; 前序遍历 class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not r…