循环队列,顺序表(数组)来实现循环队列,关键点是牺牲数组最后一个位置来安置rear指针,从而区分出循环队列元素已满的状态。每次指针位置改变后的取模操作和求队列元素个数的计算方式很重要(出队入队可能导致rear指针到front指针后面),循环的意思是任何位置都可以是队友和队尾(rear和front指向的位置)。
几种特殊情况如图:
队空:
队满:
计算队长:(front-size+MAXSIZE)%MAXSIZE
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 6
#define QUEUETRUE 1
#define QUEUEFALSE 0
typedef struct CIRCLEQUEUE
{
int front;
int rear;
int data[MAXSIZE];
}CircleQueue;
int is_Full(CircleQueue* queue)
{
if ((queue->rear + 1) % MAXSIZE == queue->front)
{
return QUEUETRUE;
}
else
{
return QUEUEFALSE;
}
}
int is_Empty(CircleQueue* queue)
{
if (queue->front == queue->rear)
{
return QUEUETRUE;
}
else
{
return QUEUEFALSE;
}
}
//初始化的队列
CircleQueue* InitCircleQueue()
{
CircleQueue* queue = (CircleQueue*)malloc(sizeof(CircleQueue));
queue->front = 0;
queue->rear = 0;
return queue;
}
void PrintQueue(CircleQueue* queue)
{
//要知道队列当前有多少个元素
int size = (queue->rear - queue->front+MAXSIZE) % MAXSIZE;
int index = queue->front;
for (int i = 0; i < size; i++)
{
printf("%d ->", queue->data[index]);
index = (index + 1) % MAXSIZE;
}
printf("NULL\n");
}
//入队,队尾入队
int Push_Queue(CircleQueue* queue, int data)
{
if (is_Full(queue))
{
return QUEUEFALSE;
}
else
{
queue->data[queue->rear] = data;
queue->rear = (queue->rear + 1) % MAXSIZE;
return QUEUETRUE;
}
}
//出队,队头出队
int Pop_Queue(CircleQueue* queue)
{
if (is_Empty(queue))
{
return QUEUEFALSE;
}
else
{
int data = queue->data[queue->front];
queue->front = (queue->front + 1) % MAXSIZE;
return data;
}
}
int main()
{
CircleQueue* queue = InitCircleQueue();
Push_Queue(queue, 1);
Push_Queue(queue, 2);
Push_Queue(queue, 3);
Push_Queue(queue, 4);
Push_Queue(queue, 5);
Push_Queue(queue, 6);
PrintQueue(queue);
Pop_Queue(queue);
PrintQueue(queue);
system("pause");
return 0;
}
测试结果: