队列中的数据存取方式是“先进先出”,只能向队尾插入数据,从队列头移动数据。队列的原型在生活中很常见,如食堂打饭的队伍,先到先服务。队列有两种实现方式:链队列和循环队列
链队列可以看作单链表的一种特殊情况,用指针把各个节点连接起来。
循环队列是一种顺序表,使用一组连续的存储单元依次存放队列元素,用两个指针head和tail分别指示队头元素和队尾元素,当head和tail走到底时,下一步回到开始的位置,从而在这组连续空间内循环。循环队列能解决溢出问题。如果不循环,head和tail都一直往前走,可能走到存储空间之外,导致溢出。
以下给出最简单的手写队列代码:
const int N = 1e5;//定义队列大小
int que[N],head,tail;//队头队尾指针,队列的大小为tail - head + 1
head++;//弹出队头,注意head <= tail
que[head];//读队头数据
que[++tail] = data;//数据data入队,尾指针加1,注意不能溢出
这个队列不是循环的,tail可能超过N,导致溢出。
竞赛中一般用STL queue或手写静态数组实现队列,下一节将重点讲解其用法