循环队列示意图
结构定义
1 | /*-------------------- 循环队列结构定义 ----------------------*/ |
重点
为什么要使用循环队列?
如果用链表实现队列的话,很简单,只要确定一个头指针和一个尾指针即可。
但这里我们选择用数组来实现,数组占用一块连续的内存地址,那么就要考虑内存的问题了,入队:尾指针递增,出队:头指针递增。
可以看出不管是增加元素还是删除元素,指针所指的内存地址都在递增,那么前面的地址就浪费了,内存空间一直在变小。
为了解决这个问题,循环队列应运而生。
实现循环队列的关键点:
- 头指针 front: 指向第一个有效节点,尾指针 rear: 指向最后一个有效节点的后面一个节点
- 队列长度:len, 有效节点数:len-1
- 入队:rear = (rear + 1) % len;
- 出队:front = (fromt + 1) % len;
- 队空:front == rear
- 队满:(rear + 1) % len == front
队列的应用:所有与时间有关的操作都会用到队列。