队列的原理
定义
定义:限制在两端进行插入操作和删除操作的线性表。
队尾:允许进行存入操作的一端。
对头:允许进行删除操作的一端。
特点
先进先出。
比如:食堂点餐,先进先出,银行叫号,先进先出。
队列的实现
循环队列
资料来源:数据结构:栈和队列(Stack & Queue)【详解】-CSDN博客
规定:front指向队头元素的位置; rear指向队尾元素的下一个位置。
为区别空队和满队,满队元素个数比数组元素个数少一个。
初始化
sequeue* queue_create()
{
sequeue* sq = malloc(sizeof(sequeue));
if (sq == NULL)
{
return NULL;
}
memset(sq->data, 0, sizeof(data));
sq->front = 0;
sq->rear = 0;
return sq;
}
入队
整体思路:
1.rear循环(如果使用rear++,则无法达到循环队列的效果,rear会溢出)。
2.满队避免数据覆盖。
int enqueue(sequeue* sq, data_t value)
{
/*判断是否满队*/
if ((sq->rear + 1) % N == sq->front)
{
printf("full");
return -1;
}
sq->data[sq->rear] = value;
/*rear循环*/
sq->rear = (sq->rear++) % N;
return 0;
}
出队
data_t dequeue(sequeue* sq)
{
data_t ret;
ret = sq->data[sq->front];
/*front循环*/
sq->front = (sq->front + 1) % N;
return ret;
}
栈空?
int queue_empty(sequeue* sq)
{
return(sq->front == sq->rear ? 1 : 0);
}
栈满?
int queue_full(sequeue* sq)
{
return((sq->rear + 1) % N == sq -> front ? 1 : 0);
}
清空
int queue_clear(sequeue* sq)
{
sq->front = sq->rear = 0;
return 0;
}
释放
sequeue* queue_free(sequeue* sq);
{
free(sq);
sq = NULL;
return sq;
}