C++ STL 中的队列(Queue)
队列(queue)是一种容器适配器,以 FIFO(先进先出)的顺序存储元素。
先插入的元素必须先被移除。
实现方式是在数据结构的一端(称为 back )插入元素,在另一端(称为 front)删除元素。

语法
队列在头文件 <queue> 中被定义为 std::queue 类模板。
cpp
queue<T> q;
其中:
T:队列中元素的数据类型。q:给队列起的名字。
基本操作
以下是可对队列执行的基本操作:
1. 插入元素
新元素只能在队列尾部(back)通过 push() 函数插入。 该过程也称为"入队(enqueue)"。
插入时间复杂度:O(1)。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
// 将元素入队
q.push(3);
q.push(4);
q.push(5);
return 0;
}
2. 访问元素
队列中只有队首(front)和队尾(back)元素可以被访问,分别使用 front() 和 back() 函数。
访问时间复杂度:O(1)。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(3);
q.push(4);
q.push(5);
// 访问队首和队尾元素
cout << q.front() << endl; // 输出队首
cout << q.back(); // 输出队尾
return 0;
}
3
5
3. 删除元素
队列中只能从队首(front)通过 pop() 函数删除元素。 该过程也称为"出队(dequeue)"。
删除时间复杂度:O(1)。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(3);
q.push(4);
q.push(5);
// 从队首删除一个元素
q.pop();
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
return 0;
}
4 5
4. empty()
检查队列是否为空。 若队列中没有任何元素,返回 true;否则返回 false。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
if (q.empty())
{
cout << "队列为空" << endl;
}
q.push(100);
if (!q.empty())
{
cout << "队列不为空,队首元素: " << q.front() << endl;
}
return 0;
}
makefile
队列为空
队列不为空,队首元素: 100
5. 队列的大小size
size() 函数返回队列当前存储的元素个数。 该操作不会修改队列内容。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(10);
q.push(5);
cout << "队列大小: " << q.size() << endl;
q.pop();
cout << "队列大小: " << q.size() << endl;
return 0;
}
makefile
队列大小: 2
队列大小: 1
6.伪遍历
由于队列只能访问队首和队尾元素,无法直接对整个队列进行遍历。
变通方法是:创建一个队列的副本,不断访问并弹出副本的队首元素,直到副本为空,即可"遍历"原队列的所有元素。
遍历时间复杂度:O(n)。
cpp
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(3);
q.push(4);
q.push(5);
// 创建原队列的副本
queue<int> temp(q);
while (!temp.empty())
{
cout << temp.front() << " ";
temp.pop();
}
return 0;
}
3 4 5
C++ 中 Queue 所有成员函数
以下是 C++ std::queue 类的全部成员函数列表:
| 函数 | 说明 |
|---|---|
front() |
访问队首元素。 |
back() |
访问队尾元素。 |
empty() |
检查队列是否为空。 |
size() |
返回队列中元素个数。 |
push() |
在队尾添加一个元素。 |
push_range() |
在队尾一次性添加多个元素。 |
emplace() |
在队尾原地构造一个元素。 |
pop() |
删除队首元素。 |
swap() |
交换两个队列的内容。 |