数据结构---队列

头文件

复制代码
  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 }

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

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

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

相关推荐
论迹复利1 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin1 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
shehuiyuelaiyuehao2 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
宸津-代码粉碎机2 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749103 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
203号居民3 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
xcLeigh3 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
玖玥拾4 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP4 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
源码宝4 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his