队列,是一种线性表,他的特性遵从先进先出(FIFO),即先进先出(first in first out),比如生活中的排队问题,后来的人排(push)在后面,在队伍头(font)的人就是每次最先出去(pop)的人。
队列有两个特点:
1,先进先出
2,在队尾添加,在队头删除
队列的一般操作有:
1,入队: 通常命名为push()
2,出队: 通常命名为pop()
3,求队列中元素个数
4,判断队列是否为空
5,获取队首元素
一般常见的线性表是用链表、数据做底层的数据结构的。
当数组作为底层数据结构时,一般讲队列实现为循环队列。
这是因为队列在顺序存储上的不足:每次从数组头部删除元素(出队)后,需要将头部以后的所有元素往前移动一个位置,这是一个时间复杂度为O(n)的操作:
如果把队首标志往后移动不就不用移动元素,会造成数组空间的“流失”。
我们希望队列的插入与删除操作都是O(1)的时间复杂度,同时不会造成数组空间的浪费,我们应该使用循环队列。
所谓的循环队列,可以把数组看出一个首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部已经没有空间,则考虑数组头部的空间是否空闲,如果是,则在数组头部进行插入。