队列是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数据来实现;链式队列是用链表来实现队列。
在对循环队列操作之前,先要建立队列结构元素:
#define BUF_SIZE 10 //循环队列的空间大小
typedef struct Queue
{
int *BUF;
int front;
int rear;
}QUEUE;
1.初始化是为新建的队列分配内存空间,然后在将头尾指针置零:
void initQueue(QUEUE *queue_q)
{
queue_q->BUF = (int *)malloc(sizeof(int)*BUF_SIZE);
if(queue_q->BUF != NULL) //队列内存分配成功
{
queue_q->front = 0;
queue_q->rear = 0;
}
}
2.判断循环队列是否为空的原理:头指针 = 尾指针
unsigned char isemptyQueue(QUEUE *queue_q)
{
if(queue_q->front == queue_q->rear)
{
return true;
}
else
{
return false;
}
}
3.判断队列是否为满:有两个办法一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%BUF_SIZE = front时,队列满。
unsigned char isfullQueue(QUEUE *queue_q)
{
if((queue_q->rear + 1) % BUF_SIZE == queue_q->front)
{
return true;
}
else
{
return false;
}
}
4.出队就是将头指针位置下的数据取出来,然后头指针偏移到被取出数据的位置
void out_Queue(QUEUE *queue_q, int *data)
{
if(isemptyQueue(queue_q) != true) //队列未空
{
*data = queue_q->BUF[queue_q->front];
queue_q->front = (queue_q->front + 1) % BUF_SIZE;
}
}
4.入队的时候,循环队列的头指针不做动作,尾指针向后偏移:
void In_Queue(*queue_q, int data)
{
if(isfullQueue(queue_q) != true) //队列未满
{
queue_q->BUF[queue_q->rear] = data;
queue_q->rear = (queue_q->rear + 1) % BUF_SIZE; //尾指针偏移
}
}