- 首先我们应该明白什么是循环队列
- 其次应知道其应该定义几个接口
废话不多说我们直接进入代码模块
首先一个数据结构的开始我们最开始应该想到的是我们应该知道他的数据内容,可以这么想,一般的队列是不是只能执行一遍呢,那我们要做一个循环队列,我们是不是应该让他可以一直循环起来呢?好接下来上图!
首先我们应该知道我们的头和尾刚开始都应该是指向零的所以我们需要在数据结构里面定义两个数据,一个代表头head,一个代表尾tail,并且我们还要定义一个队列,那么这个队列可以用数组来组建,也可以用指针来组建,因为都相当于在内存中开辟了一块空间接下来上代码!
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define MAXSIZE 5 typedef int Datatype; typedef struct queue_loop { Datatype* pq; int head, tail; }Qul;
好,那么接下来我们是不是该初始化队列了呢?没错,我么应该初始化队列了,那么我们该怎么初始化队列呢,首先我们是不是应该给队列在栈中malloc一块地址呢?没错,我们应该给结构初始化一块地址,那么我们给结构体初始化好了一块地址,我们接下来可不能忘记在给我们的队列初始化一块地址对吧,那我们其他数据的数是不是应该也要初始化一下呢,对没错,我们应该吧队列中的head和tail都初始化为0,接下来上代码!
Qul* queue_Init() { Qul* p = (Qul*)malloc(sizeof(Qul)); if (p == NULL) { free(p); return NULL; } p->pq = (int*)malloc(sizeof(int) * MAXSIZE); if (p->pq == NULL) { return NULL; } p->head = p->tail = 0; return p; }
完成了初始化后,我们是不是应该写几个判断是否为空是否为未满,并且在顺便写一个判断是否出了循环队列呢 ?接下来先上思路!
首先我们该怎么判断是否为空呢?你们想啊,是不是当p->head == p->tali的时候,是不是此时的队列就为空了,你们可以想一下当head和tail都在一起的时候,是不是此时的循环队列里面就没有数据了,那么我们应该怎么判断是否为满呢?是不是当head == (tail+1)%maxsize时他就满了呢,这时候就会有人疑惑了,为什么我们要这么干呢?首先先普及一个知识,相同的数取模是等于零,这个时候,我们的数是不是就自然的回归了本身,嘿嘿没毛病就是这样哦,接下来就是出队列了,首先我们应该判断一下是否满了呢?如果满了我们是不是就自然的插入不进去了,接下来是不是就应该把我们想要的数据插入进去了呢?对没错这时候我们呢就应该把我们想要的数据插入进去了呢,那么我们插入完之后,我们是不是应该让此时的tail向后移动一下呢?对没错接下来上代码把!
bool is_empty(Qul* p) { if (p->head == p->tail) return true; else return false; } bool is_full(Qul* p) { if (p->head == ((p->tail + 1) % MAXSIZE)) return true; else return false; } bool en_queue(Qul* p, int data) { if (is_full(p)) return false; p->pq[p->tail] = data; p->tail = ((p->tail + 1) % MAXSIZE); return true; }
入队完了,接下来我们是不是应该选择出队了呢?对滴没毛病那我们开始讲解吧!首先我们应该定义一个数据域来存储我们要出队的数据,没毛病吧!我们应该把要出的数据存在数据域当中,然后在把头向后移动一个位置!接下来上代码把!
bool out_queue(Qul* p,int* val) { if (is_empty(p)) return false; *val = p->pq[p->head]; p->head = ((p->head + 1) % MAXSIZE); return true; }
介绍完了入队出队,初始化,是不是感觉还是少了些什么呢,对的没错,我门还少一个遍历队列
首先我们应该了解队列是先进先出,所以我们遍历的话,应该是从对头开始遍历,只有当队头等于队尾的时候,我们才需要结束本次循环,那么此次的遍历就相当于完成了!好啦接下来上代码就完事啦!
void queue_Print(Qul* p) { if (is_empty(p)) return false; int i = 0; i = p->head; while (i != p->tail) { printf("%d ", p->pq[i]); i = ((i + 1) % MAXSIZE); } printf("\n"); }
本次的循环队列已经完成了哦,如果喜欢的可以点个免费的关注,留下你下期想看的程序噢