数据结构 ——— 队列oj题:设计循环队列

server/2024/10/25 11:59:56/

目录

题目要求

代码思路

代码实现


题目要求

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

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

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

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

代码思路

定义一个 front 和 rear 指针;front 指针用来指向队头,rear 指针用来指向队尾
定义一个整型变量 k ,用来记录队列的长度

利用顺序表的结构实现循环队列

要保证留一个空间置空,不存储数据,用来判断队列是否是满的
当 rear + 1 == front 时,队列就是满的,但是 rear + 1 可能会导致下标越界
所以可以根据 (rear + 1)% (k + 1) == front 判断是否满

队头出数据时,就将 front++ 即可


代码实现

typedef int QDataType;typedef struct
{int front; //指向队头的下标int rear; //指向队尾的下标int k; //队列有效数据个数(除去多开的一个空间)QDataType* a; //指向队列空间的指针} MyCircularQueue;// 初始化
MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));// 判断是否开辟成功if (obj == NULL){perror("malloc fail");return NULL;}// 多开一个空间,用来判空和判满obj->a = (QDataType*)malloc(sizeof(QDataType) * (k + 1));// 判断是否开辟成功if (obj->a == NULL){perror("malloc fail");return NULL;}obj->front = 0;obj->rear = 0;obj->k = k;return obj;
}// 插入数据
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{// 先判满if (myCircularQueueIsFull(obj))return false;// 插入数据obj->a[obj->rear] = value;obj->rear++;// 防止 rear 越界if (obj->rear == obj->k + 1){obj->rear = 0;}return true;
}// 删除数据
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{// 先判空if (myCircularQueueIsEmpty(obj))return false;// 删除数据obj->front++;// 防止 front 越界if (obj->front == obj->k + 1){obj->front = 0;}return true;
}// 访问队头数据
int myCircularQueueFront(MyCircularQueue* obj)
{// 先判空if (myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}// 访问队尾数据
int myCircularQueueRear(MyCircularQueue* obj)
{// 先判空if (myCircularQueueIsEmpty(obj))return -1;if (obj->rear == 0){return obj->a[obj->k];}else{return obj->a[obj->rear - 1];}
}// 判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{return obj->front == obj->rear;
}// 判满
bool myCircularQueueIsFull(MyCircularQueue* obj)
{return (obj->rear + 1) % (obj->k + 1) == obj->front;
}// 释放
void myCircularQueueFree(MyCircularQueue* obj)
{free(obj->a);free(obj);
}

http://www.ppmy.cn/server/134710.html

相关文章

Python爬虫:获取去哪儿网目的地下的景点数据

文章目录 1. 前言2. 网页解构分析3. 代码实现4. Java 新建 SpringBoot项目实现上述网页效果1. 前言 本篇文章讲述如何使用Python爬虫爬取去哪儿目的地下的景点数据,会提供一些参考代码,需要完整的,可以私信,但是参考代码仅供学习使用喔,不能用于商业活动!读者切记。 用这…

前端学习---(2)CSS基础

CSS 用来干什么? CSS 是用来指定文档如何展示给用户的一门语言——如网页的样式、布局、等等。 css语法: 选择器{ 属性名: 属性值; 属性名: 属性值; } h1 {color: red;font-size: 5em; }h1: 选择器 color: 属性 冒号之前是属性,冒号之后是值。 font-size…

php命令执行的一些执行函数----以ctfshow靶场为解题思路

解法10、利用文件包含 ①?cinclude$_GET[1]?>&1data://text/plain,<?php system(tac flag.php);?> cdata://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg ②?cinclude$_GET[1]?>&1php://filter/readconvert.base64-encode/resourc…

【C++刷题】力扣-#448-找到所有数组中消失的数字

题目描述 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 示例1: 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6]示例2: …

2024 10.25 判断一个矩阵是否对称

主对角线对称 思路&#xff1a;a[i][j]!a[j][i] 第一行和第一列顺序比较&#xff0c;后面依次类推 #include <stdio.h>int main(){int n,m;scanf("%d",&n);int a[n][n];for(int i0;i<n;i){for(int j0;j<n;j)scanf("%d",&a[i][j]);}i…

Fragments by E2B:AI生成应用模板,让应用开发更智能

在人工智能技术飞速发展的今天&#xff0c;我们见证了许多创新工具的诞生&#xff0c;它们正在改变传统的软件开发方式。今天&#xff0c;我要向大家介绍一个名为Fragments by E2B的开源项目&#xff0c;这是一个基于Next.js 14、shadcn/ui、TailwindCSS和Vercel AI SDK构建的A…

什么是RPC

什么是RPC RPC的全称是Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种计算机通信协议。它允许程序在不同计算机之间进行通信和交互&#xff0c;就像本地调用一样。简单解读字面上的意思&#xff0c;远程是指要跨机器而非本机&#xff0c;所以需要用到网络…

在 typescript 中,如何封装一个 class 类来接收接口的响应数据

在 TypeScript 中&#xff0c;封装一个类来接收接口的响应数据是一个常见的需求&#xff0c;特别是在处理后端 API 响应时。这通常涉及到定义与后端 API 响应结构相匹配的接口&#xff08;或类型&#xff09;&#xff0c;并在类中创建方法来处理这些数据。以下是一个简单的示例…