队列(FIFO)
概论
基本概念
只在线性表的一端进行添加元素,在线性表的另一端进行删除元素的数据结构称为队列。这种规则称为 **FIFO(first input first output)**原则。 进入队列的一端称为“队尾”,出队列的一端称为“队头”。
应用场景
根据队列的存储特性,只需要使用数据结构实现一种顺序执行 / 访问的场景可以使用队列。计算机开发中使用队列这种逻辑结构也非常广泛,像操作系统中的优先级队列,消息队列等。
分类
根据实现方式可以分为:链式队列 和 顺序队列。顺序队列的一种非常常见的优化结构称为 循环队列。
方法
实现循环队列
普通的顺序队列和循环队列比较
普通的顺序队列只能往顺序表的尾部添加元素,只能从顺序表的开头删除元素。而删除元素就是让队头下标+1.
这样就造成了一个结果:队列已经满了,但是可用元素却没有把队列所有空间利用完。
就像这样:
逻辑上已经删除的元素还依然占用着队列底层的空间,这就产生了大大的浪费。为了解决这个问题,就出现了 循环队列。
当队列已经“满”了的时候,需要添加新元素,如果是普通的顺序队列,逻辑上就是这样子的:
循环队列在面对这个问题的时候,这样子优化,就起到了充分利用空间的作用:
当队列已经”满“了的时候,它将新元素从队首开始添加,覆盖掉已经删除掉的元素,就起到了一个重复利用队列底层空间的效果。
定义节点
节点元素构成:
- 顺序表(即指定大小的数组)
- 对头下标
- 对尾下标
#define MAXSIZE 10
typedef int DataType;
typedef struct Node{
DataType _data[MAXSIZE];
int _front;
int _tail;
} Queue;
初始化
初始化队列的时候将对头和对位的下标都置为0。
void InitQueue(Queue* queue){
assert(queue