循环队列
- 首先存储队列元素的结构体是数组
- 循环的含义为front以及rear可以循环的代表任意一个数组元素的下表
通过(front+1)%len或者(rear+1)%len来实现
front为队列中第一个元素的下标
rear为队列最后元素的下一个存储空间的下标 - 判断队列是否为空,用(front=?rear)规定相等就是队列为空不相等就是队列中存在元素
- 判断队列是否已满(不是指数组满而是指队列满,数组中要留一个元素空间来判断是否已满),(rear+1)%len=?front,如果想等意味着rear的下一个指向的位置为队列的起始位置。
代码实现
构造队列的结构体
typedef struct QUEUE{
int front;
int rear;
int *ARRAY;
}QUEUE,*pQUEUE;
注意front以及rear是用来表示下标,并不是指针。
队列的初始化
void init_queue(pQUEUE pQ,int len){
pQ->ARRAY=(int*)malloc(sizeof(int)*len);
pQ->front=0;
pQ->rear=0;
}
此处申请的空间为int型的数组;可根据存储数据的需要来进行调节。
完整的代码展示包含功能为入队,出队
#include <stdio.h>
#include <stdlib.h>
//循环队列的结构体构建
typedef struct QUEUE{
int front;
int rear;
int *ARRAY;
}QUEUE,*pQUEUE;
void init_queue();
//循环队列的初始化
void en_queue();
//循环队列的入队
int full_queue();
//判断队列是否为满的
void out_queue();
void treval_queue();
int main(){
int len;
QUEUE Q;
pQUEUE pQ;
pQ=&Q;
printf("input the len of the queue");
scanf("%d",&len);
init_queue(pQ,len);
en_queue(pQ,1,len);
en_queue(pQ,2,len);
en_queue(pQ,3,len);
en_queue(pQ,4,len);
treval_queue(pQ,len);
out_queue(pQ,len);
treval_queue(pQ,len);
}
void init_queue(pQUEUE pQ,int len){
pQ->ARRAY=(int*)malloc(sizeof(int)*len);
pQ->front=0;
pQ->rear=0;
}
int full_queue(pQUEUE pQ ,int len){
if ((pQ->rear+1)%len==pQ->front){
return 1;
}
else {
return 0;
}
}
void en_queue(pQUEUE pQ,int vallue,int len){
if ((pQ->rear+1)%len==pQ->front){
}
else{
pQ->ARRAY[pQ->rear]=vallue;
pQ->rear=(pQ->rear+1)%len;
};
}
void out_queue(pQUEUE pQ,int len){
int out_value;
if (pQ->rear==pQ->front){
printf("队列为空不可出栈");
}
else{
out_value==pQ->ARRAY[pQ->front];
printf("出队列的值为%d\n",out_value);
pQ->front=(pQ->front+1)%len;
}
}
void treval_queue(pQUEUE pQ,int len){
int p_tempt=pQ->front;
printf("此队列为\n");
while (p_tempt!=pQ->rear){
printf("%d\n",pQ->ARRAY[p_tempt]);
p_tempt=(p_tempt+1)%len;
}
}