C语言之环形队列
一、环形队列的优势
环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
下面我们来详细讲解一下环形队列的实现。
二、环形队列的定义
首先,我们需要定义一个环形队列的结构体,包含以下成员变量:
- int *queue:指向环形队列的指针;
- int front:指向队列的头部;
- int rear:指向队列的尾部;
- int size:队列的容量。
typedef struct {
int *queue;
int front;
int rear;
int size;
} MyCircularQueue;
三、环形队列的初始化
在初始化环形队列时,我们需要为其动态分配内存空间,并将头指针和尾指针都初始化为-1,表示队列为空。
MyCircularQueue* myCircularQueueCreate(int k)
{
MyCircularQueue *obj =(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj->queue = (int *)malloc(sizeof(int) * k);
obj->front = -1;
obj->rear = -1;
obj->size = k; return obj;
}
四、环形队列的入队
当向队列中插入元素时,我们需要先判断队列是否已满。如果队列已满,则插入失败,返回false;否则,将元素插入到队列的尾部,并将尾指针指向下一个位置。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
if (myCircularQueueIsFull(obj))
{
return false;
} obj->rear = (obj->rear + 1) % obj->size;
obj->queue[obj->rear] = value;
if (obj->front == -1)
{
obj->front = obj->rear;
} return true;
}
五、环形队列的出队
当从队列中删除元素时,我们需要先判断队列是否为空。如果队列为空,则删除失败,返回false;否则,将元素从队列的头部删除,并将头指针指向下一个位置。
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
if (myCircularQueueIsEmpty(obj))
{
return false;
} if (obj->front == obj->rear)
{
obj->front = -1;
obj->rear = -1;
return true;
} obj->front = (obj->front + 1) % obj->size; return true;
}
六、环形队列的查看队首元素
当查看队列的头部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则返回队列头部的元素。
int myCircularQueueFront(MyCircularQueue* obj)
{
if (myCircularQueueIsEmpty(obj))
{
return -1;
} return obj->queue[obj->front];
}
七、环形队列的查看队尾元素
当查看队列的尾部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则,返回队列尾部的元素。
int myCircularQueueRear(MyCircularQueue* obj)
{
if (myCircularQueueIsEmpty(obj))
{
return -1;
} return obj->queue[obj->rear];
}
八、环形队列的判断是否为空
当判断队列是否为空时,只需要判断头指针是否为-1即可。
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
return obj->front == -1;
}
九、环形队列的判断是否已满
当判断队列是否已满时,只需要判断尾指针下一个位置是否为头指针即可。
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
return (obj->rear + 1) % obj->size == obj->front;
}
十、环形队列的销毁
当环形队列不再使用时,需要释放其占用的内存空间。
void myCircularQueueFree(MyCircularQueue* obj)
{
free(obj->queue);
free(obj);
}
总的来说,环形队列是一种非常实用的数据结构,特别适用于空间有限的情况下。通过合理的设计和实现,可以使得队列的空间利用率更高,并且操作效率也比较高。
关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。
C语言之环形队列的更多相关文章
- <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现
栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...
- 【数据结构】C++语言无锁环形队列的实现
无锁环形队列 1.Ring_Queue在payload前加入一个头,来表示当前节点的状态 2.当前节点的状态包括可以读.可以写.正在读.正在写 3.当读完成后将节点状态改为可以写,当写完成后将节点状态 ...
- 【数据结构】C++语言环形队列的实现
队列--先进先出 队列的一个缺点--出队后的内存空间浪费了,不能二次利用 环形队列--解决以上缺点的队列,用过的内存空间可以重复利用 github: https://github.com/HITFis ...
- C#实现环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: public class MyQueue<T& ...
- 数据结构-环形队列 C和C++的实现
队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...
- 【转】C#环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: 1 public class MyQueue< ...
- Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列
Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...
- 队列(Queue)--环形队列、优先队列和双向队列
1. 队列概述 队列和堆栈都是有序列表,属于抽象型数据类型(ADT),所有加入和删除的动作都发生在不同的两端,并符合First In, First Out(先进先出)的特性. 特性: ·FIFO ·拥 ...
- 环形队列C++实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用C++实现了环形队列 /******************************** ...
- C语言实现,队列可伸缩
两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素. 一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空, ...
随机推荐
- win10试安装docker部署hyperf
一:部署虚拟机,这里使用的win系统带的Hyper-V虚拟机,其它虚拟机也行 1.win+R打开命令行 2.安装Hyper-V . 失败放弃安装,选择其它吧 3.win10安装VMware 这里参考 ...
- 看了还不懂b+tree的本质就来打我
看了还不懂b+tree的本质就来打我 大家好,我是蓝胖子. 今天我们来看看b+tree这种数据结构,我们知道数据库的索引就是由b+tree实现,那么这种结构究竟为什么适合磁盘呢,它又有哪些缺点呢? 我 ...
- InstructPix2Pix: 动动嘴皮子,超越PS
摘要:InstructPix2Pix提出了一种使用文本编辑图像的方法:给定输入图像和编辑指令,告诉模型要做什么,模型将遵循这些指令来编辑图像. 本文分享自华为云社区<InstructPix2Pi ...
- JVM内存结构与内存模型
这篇文章重点讲一下jvm的内存结构和内存模型的知识点.(2023.3.11) 1.内存结构 jvm内存区域主要分为线程私有区域[程序计数器,虚拟机栈,本地方法栈],线程共享区域[堆,方法区],直接内存 ...
- vue中优雅的使用定时器
1.常见方法.在data中声明一个变量,定时器绑定到变量中,然后在beforeDestory中销毁这个定时器 举个例子 首先我在data函数里面进行定义定时器名称 data() { return { ...
- SwitchHosts operation not permitted 解决方案--亲测有效
SwitchHost!是帮助我们管理Hosts的工具,可以帮助我们做域名解析, 弥补了如果要修改域名还要改计算机C:\Windows\System32\drivers\etc位置下的hosts文件的弊 ...
- 重打包APK绕过签名校验
这里先提一种针对性校强但简单好理解的办法,纯Java实现,代码大概也就50行不到吧. 还有更强的并且能过各种保护(反调试反HOOK反内存修改等等)的万能方法,不过较复杂,长篇大论的,等有空整理出来再提 ...
- ArcGIS倾斜摄影无法加载找不到nodes节点
倾斜摄影无法加载,在fiddler请求中,nodes/root请求失败,如:http://10.0.7.173:6080/arcgis/rest/services/Hosted/xm4490/Scen ...
- pychearm日常用法
一 常用快捷键 编辑类:Ctrl + D 复制选定的区域或行Ctrl + Y 删除选定的行Ctrl + Alt + L 代码格式化Ctrl + Al ...
- SpringBoot线程池和Java线程池的实现原理
使用默认的线程池 方式一:通过@Async注解调用 public class AsyncTest { @Async public void async(String name) throws Inte ...