基于C语言的循环队列实现(包含完整代码)
循环队列不同于非循环队列和链表,其操作不需要定义next指针,只是单纯的定义一个固定的结构体变量,此结构体中的数组变量已经可以包含全部的已定义的队列长度.(如果采用循环链表来实现队列也可行,但队列会成为可变长的)
首先需要两个头文件#include <stdio.h>和#include <stdlib.h>
1.定义结构体
typedef struct Queue //定义结构体
{
int data[MAXSIZE];//表示结构体的长度
int front;//队列头
int rear;//队列尾
}Queue;
2.初始化队列
Queue *initQueue()
{
Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间
Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0
Q->rear = 0;
return Q;
}
3.判满
int isFULL(Queue *Q)
{
if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别
return 1;
else
return 0;
}
4.入队
int enQueue(Queue *Q,int data)
{
if(isFULL(Q))//先判断队列是否为满
return 0;
else
{
Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾
Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出
return 1;
}
}
5.判空
int isEmpty(Queue *Q)
{
if(Q->front==Q->rear)//与上面的判满做区别
return 0;
else
return 1;
}
6.出队
int deQueue(Queue *Q)
{
if(isEmpty(Q))//队列不空
{
int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回
Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE
return data;
}
else
return -1;
}
7.遍历输出
void printQueue(Queue *Q)
{
int i;
int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数
int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动)
for(i=0;i<length;i++)//循环输出
{
printf("%d ",Q->data[index]);
index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出
}
printf("\n");
}
8.主函数验证
int main()
{
Queue *Q = initQueue();//初始化队列
int i,data;
for(i=0;i<5;i++)
enQueue(Q,i);//验证入队
printQueue(Q);//验证遍历输出
data = deQueue(Q);//验证出队
printQueue(Q);
printf("%d\n",data);
return 0;
}
----------------------------完整代码如下-------------------------------
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5 //定义循环队列的长度为5
typedef struct Queue //定义结构体
{
int data[MAXSIZE];//表示结构体的长度
int front;//队列头
int rear;//队列尾
}Queue;
/*初始化队列*/
Queue *initQueue()
{
Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间
Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0
Q->rear = 0;
return Q;
}
/*判满*/
int isFULL(Queue *Q)
{
if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别
return 1;
else
return 0;
}
/*入队*/
int enQueue(Queue *Q,int data)
{
if(isFULL(Q))//先判断队列是否为满
return 0;
else
{
Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾
Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出
return 1;
}
}
/*判空*/
int isEmpty(Queue *Q)
{
if(Q->front==Q->rear)//与上面的判满做区别
return 0;
else
return 1;
}
/*出队*/
int deQueue(Queue *Q)
{
if(isEmpty(Q))//队列不空
{
int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回
Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE
return data;
}
else
return -1;
}
/*遍历输出*/
void printQueue(Queue *Q)
{
int i;
int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数
int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动)
for(i=0;i<length;i++)//循环输出
{
printf("%d ",Q->data[index]);
index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出
}
printf("\n");
}
int main()
{
Queue *Q = initQueue();//初始化队列
int i,data;
for(i=0;i<5;i++)
enQueue(Q,i);//验证入队
printQueue(Q);//验证遍历输出
data = deQueue(Q);//验证出队
printQueue(Q);
printf("%d\n",data);
return 0;
}