Leetcode 622. 设计循环队列

news2024/12/23 7:31:01

文章目录

  • 1.题目描述
  • 2.原题链接
  • 3.思路分析
  • 4.接口实现 :
    • Front
    • Rear
    • enQueue(value):
    • deQueue():
    • isEmpty(): 检查循环队列是否为空
    • isFull():
    • myCircularQueueFree
  • 5.代码实现

1.题目描述

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

需要实现的接口:

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

示例 :
在这里插入图片描述

2.原题链接

Leetcode 622. 设计循环队列

3.思路分析

循环队列也是队列 ,自然拥有队列的特性 : 先进先出 , 但是循环队列它的优势表现在,如果队列满了之后,我们可以直接覆盖继续增加元素。

构造一个循环队列,可以采用两种不同形式的队列:顺序表和链表的方式去实现循环队列 ,这里我们采用顺序表实现

具体步骤 :
1 定义两个指针, front 表示头, tail 表示尾。创建数组 a, k 表示当前队列的长度 ,将这些变量分装成结构体

4.接口实现 :

Front

获取队首元素是相对比较简单的。直接返回当前 front 所在的元素即可。


int myCircularQueueFront(MyCircularQueue* obj) 
{
   
    if( myCircularQueueIsEmpty(obj)==true)
    return -1 ;
    else 
     return obj->a[obj->front]; ;
}

Rear

拿到obj->rear-1 的元素

在这里插入图片描述

在这里插入图片描述

int myCircularQueueRear(MyCircularQueue* obj) 
{
   if( myCircularQueueIsEmpty(obj)==true)
       return -1 ;
    else 
     {
  
         //return obj->a[ (obj->rear-1+obj->k+1)  % (obj->k+1) ]; 
        int x = obj->rear == 0 ? obj->k : obj->rear-1 ; 
        assert( x < obj->k+1) ;
        return obj->a[x];
     }

}

enQueue(value):


bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)  //入队
{

    //队列已满 
     if(myCircularQueueIsFull(obj))
     return false ;
     //队列未满 
      obj->a[obj->rear++] = value;
       obj->rear  %= obj->k+1 ;
          return true ;
}

deQueue():

如果不取模 ,front可能越界 , 走到数组下标k+1的位置 ,所以我们取模可以让front绕回去

bool myCircularQueueDeQueue(MyCircularQueue* obj) //出队 
{ 
   //空队列 
   if( myCircularQueueIsEmpty(obj)==true)
   return false;

   obj->front ++ ;
   obj->front %=( obj->k+1); //如果不取模 ,front可能越界 , 走到数组下标k+1的位置 ,所以我们取模可以让front绕回去
   return true ; 

}

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

假设 k == 4 , 但是需要开辟了 k+1 个空间 ,也就是5个空间
当前队列的长度是k ,为什么要多开辟一个空间 ?

如果不多开辟一个空间 ,如下图 :
在这里插入图片描述

如果没有多开辟一个空间 , 就会发现无法判断循环队列是否为空

为了解决上述问题 , 我们选择多开辟一个空间便与判断循环队列是否为空, 如下图 :
在这里插入图片描述

在这里插入图片描述

bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{
   return obj->front == obj->rear ;
}

isFull():

bool myCircularQueueIsFull(MyCircularQueue* obj)
{
    return  (obj->rear + 1) % (obj->k + 1) == obj->front;
  
}

如果不取模 ,rear可能越界 , 走到数组下标k+1的位置 ,所以我们取模可以让rear绕回去
在这里插入图片描述

myCircularQueueFree

void myCircularQueueFree(MyCircularQueue* obj)
 {
    free( obj->a);
    free(obj) ;

}

5.代码实现

typedef struct
 {   
    
    int k ; 
    int *a ;
    int front ; 
    int rear ; 
     
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k)
 {
    // 顺序表 
     MyCircularQueue*obj = (MyCircularQueue*)malloc ( sizeof( MyCircularQueue));
     obj->rear =obj->front = 0 ;
     obj->k = k ;
     obj->a = (int*)malloc (sizeof( int) *(k+1)) ; //多开辟一个空间 ,好判断队列是否为空
   

     return obj ;  

}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{
   return obj->front == obj->rear ;
}


bool myCircularQueueIsFull(MyCircularQueue* obj)
 {
     return  (obj->rear + 1) % (obj->k + 1) == obj->front;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)  //入队
{
    //队列已满 
     if(myCircularQueueIsFull(obj))
     return false ;
     //队列未满 
      obj->a[obj->rear++] = value;
       obj->rear  %= obj->k+1 ;
          return true ;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) //出队 
{ 
   //空队列 
   if( myCircularQueueIsEmpty(obj)==true)
   return false;

   obj->front ++ ;
   obj->front %=( obj->k+1); //如果不取模 ,front可能越界 , 走到数组下标k+1的位置 ,所以我们取模可以让front绕回去
   return true ; 

}

int myCircularQueueFront(MyCircularQueue* obj) 
{
   
    if( myCircularQueueIsEmpty(obj)==true)
    return -1 ;
    else 
     return obj->a[obj->front]; ;
}

int myCircularQueueRear(MyCircularQueue* obj) 
{
   if( myCircularQueueIsEmpty(obj)==true)
       return -1 ;
    else 
     {
  
         //return obj->a[ (obj->rear-1+obj->k+1)  % (obj->k+1) ]; 
        int x = obj->rear == 0 ? obj->k : obj->rear-1 ; 
        assert( x < obj->k+1) ;
        return obj->a[x];
     }

}


 
void myCircularQueueFree(MyCircularQueue* obj)
 {
    free( obj->a);
    free(obj) ;

}

在这里插入图片描述
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!

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

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

相关文章

16.泛型

泛型 一、什么是泛型 泛型的本质是参数化类型&#xff0c;即给类型指定一个参数&#xff0c;然后在使用时再指定此参数具体的值&#xff0c;那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中&#xff0c;分别被称为泛型类、泛型接口、泛型方法。 二…

【ONE·C++ || 模板进阶】

总言 主要介绍模板相关内容&#xff1a;非类型模板参数、类模板特化、模板的分离编译。 文章目录 总言1、非类型模板参数1.1、主要介绍1.2、std::array 简要说明 2、模板的特化2.1、基本介绍2.2、函数模板特化2.3、类模板特化2.3.1、基本说明2.3.2、用途举例2.3.3、分类&#…

统信UOS 20 安装达梦数据库V8

统信UOS 20 安装达梦数据库V8 1、安装教程2、启动数据库实例服务失败解决方法3、使用dm管理工具连接数据库 1、安装教程 https://blog.csdn.net/OceanWaves1993/article/details/129936878 此教程进行到启动数据库实例步骤时 使用下面命令启动数据库实例服务时&#xff0c;报…

找高清图片素材,这8个网站就够了

相信很多设计师、自媒体都为找素材而烦恼&#xff0c;很多朋友不知道去哪里找图片素材&#xff0c;找到了版权还不明确&#xff0c;怕造成侵权&#xff0c;今天我就把我独家珍藏的8个图片素材网站分享给大家&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来…

APIs -- DOM浏览器

1. Window对象 1.1 BOM&#xff08;浏览器对象模型&#xff09; BOM(Browser Object Model)是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方…

crackme例子1

样本 jadx 静态分析 其中v2为查v5表得到&#xff0c;v3为用户输入index 下面就分别分析这几个值是啥 abcdefghddddd 得到v5和v4 解压assets下abcdefghddddd 拖入010 editor查看&#xff0c;实际是一个带相关数据的png文件 v5为图片位置89473开始&#xff0c;长度768字节&am…

Web安全 SQL注入漏洞测试.(可以 防止恶意用户利用漏洞)

Web安全 SQL注入漏洞测试 SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中&#xff0c;同时程序的本身对用户输入的内容过于相信&#xff0c;没有对用户插入的SQL语句进行任何的过滤&#xff0c;从而直接被SQL语句直接被服务端执行&#xff0c;导致…

AutoSAR软件组件开发的两类工作流程(Matlab/Simulink)

目录 前面 自顶向下 导入arxml文件 生成模型框架 搭建算法模型 生成代码 自下向上 前面 如何在Matlab进行AutoSAR软件组件SWC的开发&#xff1f;也就是下图红框标识出来的部分。 常规的有两种方式自顶向下与自下而上&#xff1a; 从上往下&#xff1a;从软件组件描述文…

改bug神器ChatGPT AI测试将取代人工吗?

最近ChatGPT大火&#xff0c;各大论坛中都会出现它的关键词。 机器和人对话本不是什么新鲜事&#xff0c;而ChatGPT上线仅5天&#xff0c;用户数量就超百万&#xff0c;之所以能在短时间吸引到这么多用户尝鲜&#xff0c;是因为它比“人工智障”的AI前辈们聪明多了~ 玩了一会…

Vue 3 组件通信

本文采用<script setup />的写法&#xff0c;比options API更自由。那么我们就来说说以下七种组件通信方式&#xff1a; props emit v-model refs provide/inject eventBus vuex/pinia 举个例子 本文将使用下面的演示&#xff0c;如下图所示&#xff1a; 上图中…

继承下的类型转换

一、私有/保护继承下的向上类型转换 示例&#xff1a; 图中蓝色、黄色代码均不允许使用&#xff0c;原因是在私有继承下&#xff0c;派生类和基类的public接口完全不搭界&#xff08;所实现的功能没有重叠&#xff09;&#xff0c;因此不允许强制转换&#xff0c;也无任何意义…

04-waf绕过权限控制

WAF绕过-权限控制之代码混淆及行为造轮子 思维导图 后门工具介绍: 菜刀&#xff0c;蚁剑&#xff0c;冰蝎优缺点 菜刀&#xff1a;未更新状态&#xff0c;无插件&#xff0c;单向加密传输 蚁剑&#xff1a;更新状态&#xff0c;有插件&#xff0c;拓展性强&#xff0c;单向加…

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX(ETX)的优势有哪些?

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX&#xff08;ETX&#xff09;的优势有哪些&#xff1f; 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和…

【Redis7】 Redis7 哨兵(重点:哨兵运行流程和选举原理)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 哨兵&#xff0c;重点&#xff1a;哨兵运行流程和选举原理。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文…

第一章 webpack与构建发展简史

官方loader和插件 Loaders | webpack Plugins | webpack 为什么需要构建工具&#xff1f; 初识webpack webpack默认配置文件&#xff1a;webpack.config.js 可以通过webpack --config <config_file_name>指定配置文件 rules是个数组&#xff0c;一个打包配置可以有多…

基于凸集上投影(POCS)的聚类算法

POCS&#xff1a;Projections onto Convex Sets。在数学中&#xff0c;凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点&#xff0c;可以通过找到该点在该凸集合上的投影来进行操作。该投…

Vue3图片预览(Image)

本图片预览组件主要包括以下功能&#xff1a; 展示图片时&#xff0c;可设置鼠标悬浮时的预览文本&#xff1b;图像无法加载时要显示的描述&#xff1b;自定义图像高度和宽度&#xff1b;设置图像如何适应容器高度和宽度&#xff08; fill(填充) | contain(等比缩放包含) | cov…

Node 06-包管理器

包管理工具 概念介绍 包是什么 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合 包管理工具 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除&#xff0c; 上传等操作 借助包管理工具&#xff0c;可以…

ASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL

编辑&#xff1a;ll ASEMI代理ADAU1701JSTZ-RL原装ADI车规级ADAU1701JSTZ-RL 型号&#xff1a;ADAU1701JSTZ-RL 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;LQFP-48 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;48 类型&#xff1a;车…

向凯文·凯利提问:未来 5000 天我们将走向何处?

ChatGPT 的问世不禁让人遐想&#xff0c;接下来的 5000 天&#xff0c;将会发生什么事&#xff1f; 硅谷精神之父、世界互联网教父、《失控》《必然》的作者凯文凯利&#xff08;Kevin Kelly&#xff0c;以下简称 K.K.&#xff09;是这样预测的&#xff1a; 未来将会是一切都与…