数据结构---队列

头文件

复制代码
  1 #ifndef QUEUE_H
  2 #define QUEUE_H
  3 typedef int data_t
  4 typedef struct queue
  5 {
  6     data_t *que;
  7     int head;
  8     int tail;
  9     int tlen;
 10 }queue_t;
 11 #endif

队列的创建

复制代码
  1 queue_t* queue_create(int len)                                                                                                                                                   
  2 {
        if(len<2)
            return NULL;
  3     queue_t*pq=malloc(sizeof(queue_t));
  4     if(pq==NULL)
  5         return NULL;
  6     pq->que=malloc(sizeof(data_t)*len);
  7     if(pq->que==NULL)
  8     {
  9         free(pq);
 10         return NULL;
 11     }
 12     pq->head=0;
 13     pq->tail=0;
 14     pq->tlen=len;
 15     return pq;
 16 }

整个队列放在一个结构体中,最大容量在创建时就被规定,需要注意,队列长度为0或1时队列无意义,不创建(并且长度为1时head始终等于tail,无法入队或者出队)

判断队列是否为满--是否为空

复制代码
 18 int is_full(queue_t *pque)
 19 {
 20     if((pque->tail+1)%pque->tlen==pque->head)
 21         return 1;
 22     return 0;
 23 }
 24
 25 int is_empty(queue_t *pque)
 26 {
 27     return pque->tail == pque->head;
 28 }

入队

复制代码
 30 int enqueue(queue_t *pque,data_t data)
 31 {
 32     if(is_full(pque))
 33         return -1;
 34     pque->que[pque->tail]=data;
 35     pque->tail=(pque->tail+1)%pque->tlen;
 36     return 0;
 37 }

先判断队列是否为满,不满则在尾部入队,尾下标后移,注意数组是否越界

出队

复制代码
 39 int dequeue(queue_t *pq,data_t *data)
 40 {
 41     if(is_empty(pq))
 42         return -1;
 43     *data=pq->que[pq->head];
 44     pq->head=(pq->head+1)%pq->tlen;
 45     return 0;
 46 }

判断队列是否为空,用指针拿走数据并头删

销毁队列

复制代码
 48 void queue_destroy(queue_t **pq)
 49 {
 50     if(pq==NULL || *pq==NULL)
 51         return;
 52     free((*pq)->que);
 53     free(*pq);
 54     *pq=NULL;
 55     return ;
 56 }

需要用二级指针带入结构体,用二级指针才能把主调函数中的一级指针置空

用链表也可以构成队列,只需要创建、头插、尾删(指针带出数据)、销毁

与链表队列类似,栈链表只需要创建、头插、头删(指针带出数据)、销毁

相关推荐
于烛2 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
想吃火锅10052 小时前
【leetcode】54. 螺旋矩阵
算法·leetcode·矩阵
wuminyu2 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
想吃火锅10053 小时前
【leetcode】300. 最长递增子序列
算法·leetcode·职场和发展
数模竞赛Paid answer3 小时前
2026年电工杯数学建模A题绿电直连型电氢氨园区优化运行求解全过程论文及程序
算法·数学建模·电工杯
疯狂打码的少年3 小时前
【数据结构】串的模式匹配:KMP算法(重点)
数据结构·笔记·算法
一米阳光86613 小时前
软考(中级)软件设计师核心笔记(8)数据结构——线性结构、数组、矩阵
数据结构·笔记·职场发展·软考·软件设计师·中级职称
半亩码田3 小时前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
JAVA面经实录9174 小时前
集合框架 (六)
java·开发语言