1.队列的定义
队列的定义是一种受限列表,只允许在队尾进行插入(进队),在队头进行删除(出队),无元素的称之为空队。
2.队列的性质
队列与栈截然相反是一种先进先出的线性表。
3.循环队列的引入
若队头经过一次或多次删除操作,队尾且经过一次或多次插入使空间已经“占满”,但由于前方删除操作使该队列仍然有剩余的空间,这种现象被称为假溢出现象。假溢出现象通常使用循环列表解决。
4.什么是循环队列
循环队列被称为“圆形缓冲器”,将首和尾连接起来形成一个闭环,避免空间的浪费。
5.循环队列的空与满
由于数据结构存在二义性:为避免空状态和满状态重复所以我们在要使用空间的的基础上多开辟一个空间。
空状态:头与尾相等。
满状态:尾指向多开辟空间,若下一个空间为头则是满状态。
6.循环队列代码
//循环队列定义
typedef struct
{
int* a;
int size;
int front;
int rear;
}SeqQueue;
//循环队列初始化
void QueueInit(SeqQueue* Q, int x)
{
Q->a = (int*)malloc(sizeof(int) * x);
Q->size = x;
Q->front = Q->rear = 0;
}
//循环队列判空
int QueueEmpt(SeqQueue* Q)//判空(空返回0否则返回1)
{
assert(Q);
return Q->front != Q->rear;
}
//循环队列插入
void QueuePush(SeqQueue* Q,int x)//队列进队(从尾)
{
assert(Q);
if ((Q->rear + 1) % (Q->size + 1) == Q->front)
{
printf("该队列无存储空间");
exit(-1);
}
Q->a[Q->rear] = x;
Q->rear = (Q->rear + 1) % (Q->size + 1);//元素的下一个
}
//循环队列删除
void QueuePop(SeqQueue* Q)//出队(从头)
{
assert(Q);
if (Q->front == Q->rear)
{
printf("该队列为空删除失败");
exit(-1);
}
Q->front = (Q->front + 1) % (Q->size + 1);
}
//循环队列取头数据
int QueueFront(SeqQueue* Q)//取出队头的元素
{
assert(Q);
return Q->a[Q->front];
}
//循环队列销毁
void QueueFree(SeqQueue* Q)//销毁队列
{
assert(Q);
free(Q->a);
free(Q);
Q = NULL;
}
7.完整代码
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct
{
int* a;
int size;
int front;
int rear;
}SeqQueue;//定义结构体
void QueueInit(SeqQueue* Q,int x)//初始化队列
{
Q->a = (int*)malloc(sizeof(int) * x);
Q->size = x;
Q->front = Q->rear = 0;
}
int QueueEmpt(SeqQueue* Q)//判空(空返回0否则返回1)
{
assert(Q);
return Q->front != Q->rear;
}
void QueuePush(SeqQueue* Q,int x)//队列进队(从尾)
{
assert(Q);
if ((Q->rear + 1) % (Q->size + 1) == Q->front)
{
printf("该队列无存储空间");
exit(-1);
}
Q->a[Q->rear] = x;
Q->rear = (Q->rear + 1) % (Q->size + 1);//元素的下一个
}
void QueuePop(SeqQueue* Q)//出队(从头)
{
assert(Q);
if (Q->front == Q->rear)
{
printf("该队列为空删除失败");
exit(-1);
}
Q->front = (Q->front + 1) % (Q->size + 1);
}
int QueueFront(SeqQueue* Q)//取出队头的元素
{
assert(Q);
return Q->a[Q->front];
}
void QueueFree(SeqQueue* Q)//销毁队列
{
assert(Q);
free(Q->a);
free(Q);
Q = NULL;
}
int main()
{
SeqQueue* Q = (SeqQueue*)malloc(sizeof(SeqQueue));
int i;
QueueInit(Q,5);
for (i = 0; i < 5; i++)
QueuePush(Q,i);
while (QueueEmpt(Q))
{
printf("%4d", QueueFront(Q));
QueuePop(Q);
}
QueueFree(Q);
return 0;
}