C++ 队列

C++ 队列

队列按照特定的顺序(称为先进先出,FIFO)存储多个元素。

FIFO 是 "First In, First Out"(先进先出)的缩写。为了形象地理解 FIFO,可以将队列想象成超市里排队结账的人们。排在队伍最前面的人也是第一个能够付款并离开超市的人。在计算机科学和编程中,这种元素组织方式被称为 FIFO。

向量不同,队列中的元素不能通过索引号来访问。由于队列元素是从末尾添加、从前端移除的,因此你只能访问队列的前端或后端元素。

要使用队列,必须包含 <queue> 头文件:

// 包含队列库
#include <queue>

创建队列

要创建队列,可以使用 queue 关键字,并在尖括号 <> 内指定它应存储的值的类型,然后是队列的名称:

queue<type> queueName

实例

// 创建一个名为 cars 的字符串队列
queue<string> cars;

注意:队列的类型(在我们的示例中是 string)一旦声明后就不能更改。

注意:不能像使用向量那样在声明队列时直接添加元素:

实例

queue<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

添加元素

要向队列中添加元素,可以使用 .push() 函数。

.push() 函数会在队列的末尾添加一个元素:

实例

// 创建一个字符串队列
queue<string> cars;

// 向队列中添加元素
cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

此时队列的内容如下:

Volvo(前端(第一个)元素)
BMW
Ford
Tesla(后端(最后一个)元素)

访问队列元素

不能像访问数组向量那样通过索引号来访问队列元素。

在队列中,只能使用 .front().back() 分别访问前端或后端的元素:

实例

// 访问前端元素(第一个且是最早的元素)
cout << cars.front();  // 输出 "Volvo"

// 访问后端元素(最后一个且是最新的元素)
cout << cars.back();  // 输出 "Tesla"

亲自试一试

修改前端和后端元素

也可以使用 .front().back() 来修改前端和后端元素的值:

实例

// 修改前端元素的值
cars.front() = "Audi";

// 修改后端元素的值
cars.back() = "VW";

// 访问前端元素
cout << cars.front();  // 现在输出 "Audi" 而不是 "Volvo"

// 访问后端元素
cout << cars.back();  // 现在输出 "VW" 而不是 "Tesla"

亲自试一试

移除元素

可以使用 .pop() 函数从队列中移除元素。

这会移除前端元素(即队列中第一个且是最早添加的元素):

实例

// 创建一个字符串队列
queue<string> cars;

// 向队列中添加元素
cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

// 移除前端元素(Volvo)
cars.pop();

// 访问前端元素(现在是 BMW)
cout << cars.front();

亲自试一试

获取队列的大小

要了解队列中有多少个元素,可以使用 .size() 函数:

实例

cout << cars.size();

亲自试一试

检查队列是否为空

可以使用 .empty() 函数来检查队列是否为空。

如果队列为空,.empty() 函数返回 1(true);否则返回 0(false):

实例

queue<string> cars;
cout << cars.empty(); // 输出 1(队列为空)

亲自试一试

实例

queue<string> cars;

cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

cout << cars.empty();  // 输出 0(队列不为空)

亲自试一试

栈与队列

队列经常与一起提及,栈是上一页描述的一种类似的数据结构。