1.队列的概念
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。
允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
2.顺序队列
#define N 14
typedef int datatype;
typedef struct
{
datatype data[N];//存放队列元素
Int front;//队头
Int rear;//队尾
}
初始状态(队空条件):Q->front == Q->rear == 0。
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。
3.循环队列
我们把队列的这种头尾相接的顺序存储结构称为循环队列。
当队首指针Q->front = N-1后,再前进一个位置就自动到0,这可以利用除法取余运算(%)来实现。
初始时:Q->front = Q->rear=0。
队首指针进1:Q->front = (Q->front + 1) %N。
队尾指针进1:Q->rear = (Q->rear + 1) % N。
队列长度:(Q->rear - Q->front + N) %N。
队满条件: (Q->rear + 1)%N == Q->front
队空条件仍: Q->front == Q->rear
队列中元素的个数: (Q->rear - Q ->front + N)% N
创建
sequeue *queue_create()
{
sequeue *q;
q = (sequeue*)malloc(sizeof(sequeue));
if(q == NULL)
{
printf("malloc failed\n");
return NULL;
}
memset(q->data,0,sizeof(q->data));//数组清0
q->front = q->rear = 0;//初始化队头和队尾
return q;
}
清空
int queue_clear(sequeue *q)
{
if(q == NULL)
{
printf("q is NULL\n");
return -1;
}
q->front = q->rear = 0;
}
判空
int queue_empty(sequeue *q)
{
if(q == NULL)
{
printf("q is NULL\n");
return -1;
}
return ((q->front == q->rear ? 1 : 0));//判断队头和队尾是否相等
}
判满
int queue_full(sequeue *q)
{
if((q->rear+1) % N == q->front)//判断队列是否满了
{
return 1;
}
else
{
return 0;
}
}
入队
int enqueue(sequeue *q,data_t x)
{
if(q == NULL)
{
printf("q is NULL\n");
return -1;
}
if((q->rear+1) % N == q->front)
{
printf("q is full\n");
return -1;
}
q->data[q->rear] = x;//入队
q->rear = (q->rear+1) % N;//队尾更新
}
出队
data_t dequeue(sequeue *q)
{
data_t ret;
ret = q->data[q->front];
q->front = (q->front+1) % N;
return ret;
}
销毁
sequeue *queue_free(sequeue *q)
{
if(q == NULL)
{
printf("q is NULL\n");
return NULL;
}
free(q);
q = NULL;
}