1、队列基础知识
队列中的插入添加操作称为入队(enqueue),删除操作称为出队(dequeue);队列有队头与队尾,类似于排队结账的队伍一样;可以利用数组来实现队列这个数据结构,当然也可以用链表实现;
2、队列的实现
2.1 队列的数组实现
定义一个数组,数组大小固定,那么队列需要判断队列是否为空和队列是否已满;对于队列已满的操作,可以将rear(后部)再绕回指向队列起始位置,此操作方式又称为循环队列;循环队列操作需要注意的是:判断队列是否为空很重要,如果dequeue一个空队列,得到的是一个未知的元素;
- front - a[2] - a[3] - a[4] - rear -
代码示例:
#include <stdio.h>
#include <stdlib.h>
#define QUEUE_MAX_SIZE 10
struct Queue
{
int cap;
int front;
int rear;
int size;
int *arry;
};
void creat_queue(struct Queue *new_queue, int queue_size)
{
new_queue->cap = queue_size;
new_queue->size = 0;
new_queue->front = 0;
new_queue->rear = 1;
new_queue->arry = (int *)calloc(0, queue_size);
if (new_queue->arry == NULL)
{
printf("creat new queue failed !\n");
}
}
int queue_is_empty(struct Queue *queue)
{
return queue->size == 0;
}
int queue_is_full(struct Queue *queue)
{
return queue->size == queue->cap;
}
void queue_make_empty(struct Queue *queue)
{
queue->size = 0;
queue->front = 1;
queue->rear = 0;
}
int queue_enqueue(int element, struct Queue *queue)
{
if (queue_is_full(queue))
{
printf("queue is full !\n");
return -1;
}
queue->size++;
if (++queue->rear == queue->cap)
{
queue->rear = 0;
}
queue->arry[queue->rear] = element;
printf("enqueue %d\n", element);
return 0;
}
int queue_dequeue(struct Queue *queue)
{
if (queue_is_empty(queue))
{
printf("queue is empty !\n");
return -1;
}
queue->size--;
if (++queue->front == queue->cap)
{
queue->front = 0;
}
printf("dequeue %d\n", queue->arry[queue->front]);
return queue->arry[queue->front];
}
int main(void)
{
struct Queue queue;
int i;
creat_queue(&queue, QUEUE_MAX_SIZE);
for (i = 0; i < QUEUE_MAX_SIZE; i++)
{
queue_enqueue(i, &queue);
}
for (i = 0; i < QUEUE_MAX_SIZE; i++)
{
queue_dequeue(&queue);
}
return 0;
}