循环队列是一种空间确定的数据结构,属于线性结构的优化形式。
队列的数据结构为一端进,一端出的形式,即先进先出(FIFO)。
循环队列原理
循环队列主要由一个定长的数组和两个整型记录队列首尾位置的下标。
由队列一端的位置入队时,需要判断队列是否为空,同理由队列另一端出队时,需要判断队列是否为满。
循环队列的主要操作如下:
1.判断队空
循环队列判断是否为空的方式为:队首的下标与队尾的下标是否重合。
2.判断队满
循环队列判断是否为满的方式为:队尾的下标的下一位是否为队首的下标。
即(队尾下标+1)%队列总长=队首下标。
3.入队
入队时先要判断队列是否为满,若为满则无法入队,入队时将队首下标前移一位。
4.出队
出队时先要判断队列是否为空,若为空则无法出队,出队时将队尾下标前移一位。
具体代码实现
结构体
#define MAXSIZE 5
typedef struct Queue {
int front;
int rear;
int data[MAXSIZE];
}Queue;
data为数组,长度为MAXSIZE(本文中为5)。
front为队尾下标,rear为队首下标。
初始化
Queue* initqueue()
{
Queue* q = (Queue*)malloc(sizeof(Queue));
q->front = 0;
q->rear = 0;
return q;
}
判断队空
int isempty(Queue* q)
{
if (q->rear == q->front)
{
return 1;
}
else
{
return 0;
}
}
判断队满
int isfull(Queue* q)
{
if ((q->rear + 1) % MAXSIZE == q->front)
{
return 1;
}
else
{
return 0;
}
}
入队
void inqueue(Queue* q, int data)
{
if (isfull(q))
{
return;
}
else
{
q->data[q->rear] = data;
q->rear = (q->rear + 1) % MAXSIZE;
}
}
出队
void outqueue(Queue* q)
{
if (isempty(q))
{
return;
}
else
{
q->front = (q->front + 1) % MAXSIZE;
}
}