首页 > 其他分享 >C语言之环形队列

C语言之环形队列

时间:2023-05-14 16:14:33浏览次数:45  
标签:return 队列 环形 C语言 int front obj

一、环形队列的优势

环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
下面我们来详细讲解一下环形队列的实现。

二、环形队列的定义

首先,我们需要定义一个环形队列的结构体,包含以下成员变量:

  • 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知识共享】,后续精彩内容及时收看了解。

标签:return,队列,环形,C语言,int,front,obj
From: https://www.cnblogs.com/embedded2share/p/17399450.html

相关文章

  • c语言的初步认识
    #include<stdio.h>intmain(){printf("hehe\n")return0;}首先看着一组代码,这是c语言最基础的代码,也是在c语言编程学习中最早需要认识的代码。intmain()是一个程序的主函数,也是程序的入口,不能缺少的函数,有且只有能有一个。int是整形的意思,main()前面放一个int指的是main......
  • 01-Linux命令和C语言基础
    1Linux开发环境搭建1.1虚拟机安装1、安装VMWare2、安装ubuntu分区--Linux没有盘符的概念/--5000M/boot--系统启动过程中读取的重要文件/swap--2000M,虚拟内存是物理内存的两倍左右/home--常见的分区Linux文件系统结构是通过文件夹管理的虚拟内存是一段硬......
  • 单调队列算法模板及应用
    文章和代码已经归档至【Github仓库:https://github.com/timerring/algorithms-notes】或者【AIShareLab】回复算法笔记也可获取。队列算法模板//hh表示队头,tt表示队尾intq[N],hh=0,tt=-1;//向队尾插入一个数q[++tt]=x;//从队头弹出一个数hh++;//队头......
  • C语言函数大全-- w 开头的函数(2)
    C语言函数大全本篇介绍C语言函数大全--w开头的函数1.wcstok1.1函数说明函数声明函数功能wchar_t*wcstok(wchar_t*wcs,constwchar_t*delim,wchar_t**ptr);用于将一个长字符串拆分成几个短字符串(标记),并返回第一个标记的地址wchar_t*wcstok(wchar_t*wcs......
  • 哈希表——创建,查找结点——C语言描述
    哈希表——创建,查找结点——C语言描述目录哈希表——创建,查找结点——C语言描述0测试用例框架1定义2数据结构2初始化哈希表与查找(1)代码(2)测试用例(3)打印结果0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%22......
  • C语言程序设计(第四版)谭浩强版 课后答案 第五章
    2、#include<stdio.h>#include<math.h>intmain(){intsign=1,count=0;doublepi=0.0,n=1.0,term=1.0;while(fabs(term)>=pow(10,-6)){pi=pi+term;n=n+2;si......
  • c语言
    c语言命令:int摘要:C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同。在32/64位系统中都是32位,范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295。c语言命令:scanf摘要:scanf是C语言中的输入......
  • 生产者消费者模型,队列
    主要用来解耦,适合高并发场景、爬虫栈先进后出FILO借助队列实现FIFO队列是安全的不用加锁q.get()阻塞等待或取数据,如果有数据直接获取,如果没有数据就阻塞等待q.put()阻塞或放数据,如果可以放数据继续放,不可以放阻塞等待(IO操作)q.get_nowait()不阻塞,如果有数据直接获......
  • C语言刷leetcode——贪心
    目录贪心刷题252.会议室(P)253.会议室II(P)1353.最多可以参加的会议数目贪心找到贪心策略,使得:局部最优解-->整体最优解刷题252.会议室(P)253.会议室II(P)#defineMAX1000001intminMeetingRooms(int**intervals,intintervalsSize,int*intervalsColSize){......
  • 关于C语言getchar()的作用理解
    让我们先看一个程序#include<stdio.h>intmain(){charch[100];fgets(ch,10,stdin);//用标准输入设备输入fputs(ch,stdout);//用标准输出设备输出return0;}这个时候,我们输入超过10个字符,只读前十个字符;不超过10个字符,输入字符时,输出会多输出一行,说明\n也......