#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

#define maxsize 6

/*

循环队列是采用数组实现,传统的数组解决造成浪费大量内存。改进版既是循环数组来解决。

*/

typedef struct queue

{

int *pBase;

int front;

int rear;

}Queue;

void DeQueue(Queue *,int *val);

void EnQueue(Queue *,int);

void initQueue(Queue *);

bool queueFull(Queue *);

bool queueEmpty(Queue *);

void main()

{

Queue queue;

//初始化队列

initQueue(&queue);

//入队

EnQueue(&queue,2);

EnQueue(&queue,3);

EnQueue(&queue,5);

EnQueue(&queue,4);

//出队

int val;

DeQueue(&queue,&val);

DeQueue(&queue,&val);

DeQueue(&queue,&val);

DeQueue(&queue,&val);


}

void initQueue(Queue *queue)

{

//头坐标指向第一个元素,为坐标指向当前元素的下一个。

queue->front=0;

queue->rear=0;

queue->pBase=(int *)malloc(sizeof(int)*6);

if(queue->pBase==NULL)

{

printf("内存分配失败");

exit(-1);

}

}

void EnQueue(Queue *queue,int val)

{

if(queueFull(queue))

{

printf("当前队列已经满了,无法再入队了");

return;

}

queue->pBase[queue->rear]=val;

queue->rear=(queue->rear+1)%maxsize;// 假设从数组5开始,入完了之后,还可以在从0开始入。


}

void DeQueue(Queue *queue,int *val)

{

if(queueEmpty(queue))

{

printf("当前队列已经为空了,无法再出队了");

return;

}

*val=queue->pBase[queue->front];

queue->front=(queue->front+1)%maxsize;// 假设从数组5开始,入完了之后,还可以在从0开始入。

printf("%d  ",*val);

printf("\n");

}

bool queueFull(Queue *queue)

{

if((queue->rear+1)%maxsize==queue->front)

return true;

else

return false;


}

bool queueEmpty(Queue *queue)

{

if(queue->rear==queue->front)

return true;

else

return false;

}

//一个循环数组如果rear==front,无法判断其是否为空,还是满?

/*怎么办呢?让一个空间不存粗元素,空间为6的数组,满的时候,只能存5个。

另外还有一个问题,循环数组,怎么来判断其是否为满呢?

循环数组怎么让他们从6下面又变成0,方法有的是数数,0,1,2,3,4,5,6,7,8,8,10,11,10,11,可以这样认为吗

0,1,2,3,4,5,6第一个数完之后,在重新数0,1,2,3,4,5,,不就可以了吗,不就数完了吗。重新数,不就是求余操作。

那怎么判断为满的情况呢,还是数数,有一个不存,只要保证当前尾坐标的下个位置和头坐标是一个位置,不就可以了吗!