队列(queue)是一种操作(或者说运算)受到限制的特殊线性表。其插入操作限定在表的一端进行,称为“入队”;其删除操作则限定在表的另一端进行,称为“出队”。插入一端称为队尾(rear/tail);删除一端称为队头(front)。
队列也被称作“先进先出”线性表(FIFO,First In First Out)。类似于生活中排队购票,先来先买,后来后买。
队列有两种实现方式:链队列和循环队列。
- 链队列,可以把它看成是单链表的一种特殊情况,用指针把各个节点连接起来。
- 循环队列,是一种顺序表,使用一组连续的存储单元依次存放队列元素,用两个指针front和rear分别指示队列头元素和队列尾元素。由于队列是先进先出的一个“队伍”,所以在存储单元中,front和rear都是一直往前走,走到存储空间的最后面,可能会溢出。为了解决这一问题,把队列设计成环状的循环队列。
队列和栈的主要问题是查找较慢,需要从头到尾一个个查找。在某些应用情况下,可以用优先队列,让优先级最高(比如最大的数)先出队列。
由于队列很简单,而且往往是固定大小的,所以在竞赛中一般就用静态数组来实现队列,或者使用STL queue。
queue 是 STL 中实现的一个“先进先出”的容器,只能通过函数 front ()来访问队首元素,或通过函数 back()来访问队尾元素。
#include<queue>
using namespace std;
queue<int> q; //声明队列q
q.push(x) //push(x)用来将 x 从队尾入队,时间复杂度为0(1)。
q.front() //front()获得队首元素,时间复杂度为 0(1)。
q.back() //back()获得队尾元素,时间复杂度为 0(1)。
q.pop() //pop()用来让队首元素出队,时间复杂度为 0(1)。
q.empty()//检测q是否为空,返回true或false,时间复杂度为0(1)。
q.size() //size()返回 q 内元素的个数,时间复杂度为 0(1)。