//循环队列的实现
#include<stdio.h>
//定义队列数据类型
//rear指向队尾元素下标的下一个下标,front指向对头元素的下标
typedef struct Queue{
int *pBase;//一个数组 等于int pBase[]
int front;//对头指针
int rear; //队尾指针
} QUEUE,*PQUEUE;
//初始化队列
void init(PQUEUE queue)
{
//动态开辟一个数组
queue->pBase = (int *)malloc(sizeof(int)*6); //数组的长度为6
if(queue->pBase==NULL){
printf("动态内存分配失败");
exit(-1);//结束程序
}
else{
//设置初始状态:front=rear=0(这是队列为空的一种情况)
queue->front=queue->rear=0;
}
}
//入队操作
int en_queue(PQUEUE queue,int val)//返回0表示入队失败,1表示入队成功
{
if(full_queue(queue))
{
//队列已经满了
printf("队列已经满了,入队失败\n");
return 0;
} else{
//队列还没有满
queue->pBase[queue->rear]=val;//将要插入的值赋到rear的下一个位置
queue->rear=(queue->rear+1)%6;//rear上移
return 1;
}
}
//判断队列是否已满
//**使用空出数组的一个位置来保证不和数组为空的条件冲突
int full_queue(PQUEUE queue)//返回0数组没有满,1表示数组已满
{
//当rear和front相邻,即数组已满
if((queue->rear+1)%6==queue->front){//数组已经满
printf("队列已经满了\n");
return 1;
} else{
return 0;//队列并没有满
}
}
//输出队列
void traverse_queue(PQUEUE queue)
{
//我们进行遍历queue(从对头到队尾)
int p = queue->front;
while(p!=queue->rear)
{
printf("%d ",queue->pBase[p]) ;
p=(p+1 )%6;
}
}
//出队操作
//返回0表示出队失败,返回1表示出队成功
int out_queue(PQUEUE queue,int *val)//val用于保存删除的元素
{
if(empty(queue)){//队列为空
printf("队列为空,出队失败\n");
return 0;
}else{//队列非空
*val=queue->pBase[queue->front];//将要出队的元素赋值给*val
queue->front =(queue->front+1)%6;//front指针移到下一个为子
return 1;
}
}
//判断队列是否为空
int empty(PQUEUE queue)//返回1表示为空,返回0表示队列不为空
{
//**:当front==rear队列为空
if(queue->front==queue->rear){
return 1;//为空
}else{
return 0;//不为空
}
}
int main()
{
int val;
QUEUE queue;//定义一个队列
init(&queue);
en_queue(&queue,3);
en_queue(&queue,2);
en_queue(&queue,1);
en_queue(&queue,0);
en_queue(&queue,0);
//en_queue(&queue,0);
traverse_queue(&queue);
// printf("hello world\n");
return 0;
}