队列
队列遵循先进先出(FIFO):在队尾 push,从队首 pop,以 front/back 查看两端。std::queue 是默认基于 deque 的容器适配器,基本操作为 O(1);取队首或出队前应确认非空。
层序遍历与 BFS
队列使先发现的节点先处理,适合二叉树层序遍历和图的广度优先搜索。无权图中顶点第一次出现在搜索过程时,得到的距离就是最少边数。
queue<int> q;
vector<int> dist(n, -1);
dist[s] = 0; q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : g[u]) if (dist[v] == -1) {
dist[v] = dist[u] + 1;
q.push(v);
}
}
邻接表图的 BFS 时间为 O(V+E),空间为 O(V)。二叉树层序遍历可在每轮先记录 q.size(),恰好处理当前层的所有节点。
双端队列
deque 支持 push_front、push_back、pop_front、pop_back,适用于需要两端操作的任务。栈只在同一端进出,队列在两端进出,二者的处理顺序不同。
单调队列
滑动窗口最大值可维护存储下标、对应值单调递减的 deque:队首删除已离开窗口的下标,队尾删除不大于当前值的下标,再加入当前下标;当窗口形成后,队首即最大值。每个下标最多进出一次,总时间 O(n)、额外空间 O(k)。
deque<int> dq;
for (int i = 0; i < n; ++i) {
while (!dq.empty() && dq.front() <= i - k) dq.pop_front();
while (!dq.empty() && a[dq.back()] <= a[i]) dq.pop_back();
dq.push_back(i);
if (i >= k - 1) ans.push_back(a[dq.front()]);
}