循环队列就是用了 取模 的方法来改善了 数组存储越界的问题。
当 rear 或者 front 超过了数组的最大下标时,用 rear = (rear + 1) % MAXSIZE 和 front = (front + 1) % MAXSIZE来实现一个轮回.
就是自己要去学会找到它们之间的关系。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef int Data;
typedef struct{
Data data[MAXSIZE];
int front,rear;
int lengh;
}Queue;
//初始化队列
void init_queue(Queue *queue);
//判断队列是否为空
bool is_empty(Queue *queue);
//判断队列是否已满
bool is_full(Queue *queue);
//入队
bool enqueue(Queue *queue, Data data);
//出队
bool dequeue(Queue *queue);
//显示队列首元素
Data get_queue_front(Queue *queue);
//显示目前队列内的所有元素
void show_queue(Queue *queue);
int main()
{
Queue queue;
printf("初始化环形数组队列,默认容量为10\n");
init_queue(&queue);
printf("把0 1 2 3 4 5依次入队\n");
enqueue(&queue,0);
enqueue(&queue,1);
enqueue(&queue,2);
enqueue(&queue,3);
enqueue(&queue,4);
enqueue(&queue,5);
show_queue(&queue);
printf("出队列3次\n");
dequeue(&queue);
dequeue(&queue);
dequeue(&queue);
show_queue(&queue);
printf("把6 7 8 9 10 11 12 13依次入队\n");
enqueue(&queue,6);
enqueue(&queue,7);
enqueue(&queue,8);
enqueue(&queue,9);
enqueue(&queue,10);
enqueue(&queue,11);
enqueue(&queue,12);
enqueue(&queue,13);
printf("13入队列失败\n");
show_queue(&queue);
printf("出队列6次\n");
dequeue(&queue);
dequeue(&queue);
dequeue(&queue);
dequeue(&queue);
dequeue(&queue);
dequeue(&queue);
show_queue(&queue);
return 0;
}
//初始化队列
void init_queue(Queue *queue)
{
queue->front = 0;
queue->rear = -1;
queue->lengh = 0;
}
//判断队列是否为空
bool is_empty(Queue *queue)
{
if(queue->lengh == 0)
return true;
else
return false;
}
//判断队列是否已满
bool is_full(Queue *queue)
{
if(queue->lengh == MAXSIZE)
return true;
else
return false;
}
//入队
bool enqueue(Queue *queue, Data data)
{
if(is_full(queue))
{
printf("队列已满,不能入队\n");
return false;
}
queue->data[queue->rear = ++queue->rear % MAXSIZE] = data;
queue->lengh++;
return true;
}
//出队
bool dequeue(Queue *queue)
{
if(is_empty(queue))
{
printf("队列空,不能出队\n");
return false;
}
queue->front = (queue->front + 1) % MAXSIZE;
// printf("front is %d ",queue->front);
queue->lengh--;
return true;
}
//显示队列首元素
Data get_queue_front(Queue *queue)
{
if(is_empty(queue))
{
printf("队列空,不能出队\n");
return false;
}
return queue->data[queue->front];
}
//显示目前队列内的所有元素
void show_queue(Queue *queue)
{
int n = queue->lengh;
int nfront = queue->front;
printf("队列内目前的元素 ");
while(n != 0)
{
printf("%d, ", queue->data[queue->front]);
queue->front = (queue->front + 1) % MAXSIZE;
n--;
}
printf("\n");
queue->front = nfront;
}
