C++ 双端队列
C++ 双端队列
在上一页中,你学习了在 队列 中,元素是在尾部添加,在头部删除的。
然而,双端队列(double-ended queue 的缩写)更加灵活,因为元素可以从两端(头部和尾部)添加和删除。你还可以通过索引号访问元素。
要使用双端队列,你必须包含 <deque>
头文件
// 包含双端队列库
#include <deque>
创建双端队列
要创建双端队列,使用 deque
关键字,并指定它应该存储的值的类型,放在尖括号 <>
中,然后是双端队列的名称,例如:deque<type> dequeName
。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars;
如果你想在声明时添加元素,将它们放在花括号 {}
中,用逗号分隔。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 打印双端队列元素
for (string car : cars) {
cout << car << "\n";
}
自己试试 »
注意:双端队列的类型(我们示例中的 string
)在声明后不能更改。
访问双端队列
你可以通过在方括号 []
中引用索引号来访问双端队列元素。
双端队列是 0 索引的,这意味着 [0]
是第一个元素,[1]
是第二个元素,依此类推。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第一个元素
cout << cars[0]; // 输出 Volvo
// 获取第二个元素
cout << cars[1]; // 输出 BMW
自己试试 »
你还可以使用 .front()
和 .back()
函数访问双端队列的第一个或最后一个元素。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第一个元素
cout << cars.front();
// 获取最后一个元素
cout << cars.back();
自己试试 »
要访问指定索引处的元素,可以使用 .at()
函数并指定索引号。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第二个元素
cout << cars.at(1);
// 获取第三个元素
cout << cars.at(2);
自己试试 »
注意:.at()
函数通常比方括号 []
更受欢迎,因为它在元素超出范围时会抛出错误消息。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 尝试访问不存在的元素(会抛出异常)
cout << cars.at(6);
自己试试 »
更改双端队列元素
要更改特定元素的值,可以引用索引号。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 更改第一个元素的值
cars[0] = "Opel";
cout << cars[0]; // 现在输出 Opel 而不是 Volvo
自己试试 »
但是,使用 .at()
函数更安全。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 更改第一个元素的值
cars.at(0) = "Opel";
cout << cars.at(0); // 现在输出 Opel 而不是 Volvo
自己试试 »
添加双端队列元素
要向双端队列添加元素,可以使用 .push_front()
在双端队列的开头插入元素,并使用 .push_back()
在末尾添加元素。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 在开头添加元素
cars.push_front("Tesla");
// 在末尾添加元素
cars.push_back("VW");
自己试试 »
删除双端队列元素
要从双端队列中删除元素,使用 .pop_front()
从双端队列的开头删除元素,并使用 .pop_back()
从末尾删除元素。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 删除第一个元素
cars.pop_front();
// 删除最后一个元素
cars.pop_back();
自己试试 »
双端队列大小
要找出双端队列中有多少个元素,可以使用 .size()
函数。
检查双端队列是否为空
使用 .empty()
函数来确定双端队列是否为空。
.empty()
函数在双端队列为空时返回 1
(true),否则返回 0
(false)。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.empty(); // 输出 0 (不为空)
自己试试 »
遍历双端队列
你可以使用 for
循环结合 .size()
函数来遍历双端队列元素。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (int i = 0; i < cars.size(); i++) {
cout << cars[i] << "\n";
}
自己试试 »
您也可以使用for-each循环(在C++版本11 (2011)中引入),它更简洁易读。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (string car : cars) {
cout << car << "\n";
}
自己试试 »
提示:您还可以使用迭代器遍历双端队列,这将在后面的章节中详细介绍。