找回密码
 立即注册
首页 业界区 科技 数据结构-循环队列

数据结构-循环队列

赏勿 4 天前
创建一个循环队列,实现入队出队功能,队列只能一端进行入队,另一端进行出队,先进先出的规则。
  1. /***************************************************************************
  2. *function:创建一个循环队列,实现入队出队的功能
  3. *author:jindouliu2024@163.com
  4. *date:2025.4.5
  5. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  6. * ***************************************************************************/
复制代码
创建管理队列的结构体
  1. //构造记录循环队列SequenceQueue各项参数(循环队列的首地址 + 循环队列的容量 + 循环队列中尾元素下标+ 循环队列中首元素下标)的结构体
  2. typedef struct SequenceQueue
  3. {
  4.         DataType_t * Addr;                //记录循环队列首地址
  5.         unsigned int Size;                //记录循环队列的容量
  6.         int                         Rear;      //循环队列中尾元素的下标       
  7.         int                         Front;      //循环队列中首元素的下标
  8. }SeqQueue_t;
复制代码
创建队列并初始化
  1. //创建循环队列并对循环队列进行初始化
  2. SeqQueue_t * SeqQueue_Create(unsigned int size)
  3. {
  4.         //1.利用calloc为循环队列的管理结构体申请一块堆内存
  5.         SeqQueue_t *Manager = (SeqQueue_t *)calloc(1,sizeof(SeqQueue_t));
  6.         if(NULL == Manager)
  7.         {
  8.                 perror("calloc memory for manager is failed");
  9.                 exit(-1); //程序异常终止
  10.         }
  11.         //2.利用calloc为所有元素申请堆内存
  12.         Manager->Addr = (DataType_t *)calloc(size,sizeof(DataType_t));
  13.         if (NULL == Manager->Addr)
  14.         {
  15.                 perror("calloc memory for element is failed");
  16.                 free(Manager);
  17.                 exit(-1); //程序异常终止
  18.         }
  19.         //3.对管理循环队列的结构体进行初始化(元素容量 + 最后元素下标)
  20.         Manager->Size = size;        //对循环队列中的容量进行初始化
  21.         Manager->Rear = 0;                //由于循环队列为空,则队尾下标初值为0
  22.         Manager->Front = 0;                //由于循环队列为空,则队首下标初值为0
  23.        
  24.         return Manager;
  25. }
复制代码
判断队列是否满
  1. //判断循环队列是否已满
  2. bool SeqQueue_IsFull(SeqQueue_t *Manager)
  3. {
  4.         return ((Manager->Rear+1) % Manager->Size)==Manager->Front ? true : false;//空的话返回true
  5. }
复制代码
判断队列是否为空
  1. //判断循环队列是否为空
  2. bool SeqQueue_IsEmpty(SeqQueue_t *Manager)
  3. {
  4.         return (Manager->Rear == Manager->Front) ? true : false;//满的话返回true
  5. }
复制代码
入队
  1. //入队
  2. bool SeqQueue_Enqueue(SeqQueue_t *Manager, DataType_t Data)
  3. {
  4.         //1.判断循环队列是否已满
  5.         if ( SeqQueue_IsFull(Manager) )
  6.         {
  7.                 printf("SeqQueue is Full!\n");
  8.                 return false;
  9.         }
  10.         //2.如果循环队列有空闲空间,则入队
  11.         Manager->Addr[Manager->Rear] = Data;
  12.         Manager->Rear = (Manager->Rear+1) % Manager->Size;
  13.         return true;
  14. }
复制代码
出队
  1. //出队
  2. DataType_t SeqQueue_Dequeue(SeqQueue_t *Manager)
  3. {
  4.         DataType_t data = -1;
  5.         //1.判断循环队列是否为空,如果为空返回-1
  6.         if(SeqQueue_IsEmpty(Manager)){
  7.                 printf("SeqQueue is Empty\n");
  8.                 return data;
  9.         }
  10.         //不为空时,则出队
  11.         data = Manager->Addr[Manager->Front];
  12.         Manager->Front = (Manager->Front + 1) % Manager->Size;
  13.         return data;
  14. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册