C++ Queue

2025年8月29日 | 阅读11分钟

在 C++ 中,队列表示基本数据结构,它们遵循先进先出 (FIFO) 的逻辑。C++ 的 标准模板库 (STL) 通过其现成的组件提供了一个队列类,可以提高队列操作的效率。

C++ Queue

队列是一种线性数据结构,它通过一种队列机制来处理元素,该机制在队尾插入元素,在队头移除元素。队列的工作方式类似于售票处排队,因为顾客根据他们到达的顺序获得服务。

队列在编程中发挥着至关重要的作用,因为开发人员需要它们来执行任务调度功能、模拟基于行的服务以及在树中执行层序遍历。

队列的操作

C++ 中队列的几个操作如下:

  1. 入队 (Enqueue):用于在队列末尾插入一个元素。
  2. 出队 (Dequeue):用于从队列前端移除一个元素。
  3. 队首 (Front):返回队列的第一个元素。
  4. 队尾 (Rear):返回队列的最后一个元素。

语法

它具有以下语法:

在这个语法中,

  • Obj:表示队列中元素的类型。
  • Container:表示容器对象的类型。

队列示例

让我们通过一个例子来说明 C++ 中的队列。

示例

编译并运行

输出

The Front element of the Queue is: 25
The Rear element of the Queue is: 41
The Front element after pop: 37

说明

在此示例中,我们演示了使用 STL queue 容器的基本队列操作。它向队列中添加了三个整数,显示了队首和队尾元素,使用 pop() 移除了队首元素,然后显示了更新后的队首。之后,队列遵循 FIFO 原则。

队列的关键特征

C++ 中队列的几个特征如下:

  • FIFO 顺序:队列在 FIFO 顺序系统下,完全按照其到达顺序处理元素。
  • 动态结构:队列结构允许在恒定时间内进行添加和移除操作。

这些系统积极参与作业调度、管理客户服务运营以及提高数据缓冲效率。

C++ 中队列的声明和初始化

队列元素通过 push() 函数来初始化,在声明后逐个插入元素。在 C++ 中,我们可以通过多种方式声明和初始化队列。

语法

它具有以下语法:

  • datatype:队列将存储的元素类型(例如,int、string、float)。
  • queue_name:表示队列的标识符。

声明和初始化队列的示例

让我们通过一个例子来说明如何在 C++ 中声明和初始化队列。

示例

编译并运行

输出

Front: 10
Back: 30

说明

在此示例中,我们演示了 STL queue 容器的用法。首先,我们声明一个整数队列并使用 push() 函数插入三个元素。之后,front() 函数检索第一个插入的元素,而 back() 检索最后一个添加的元素。

成员类型

下面是队列成员类型列表及其简要描述。

成员类型描述
value_type指定元素类型。
container_type指定底层容器类型。
size_type它指定元素的尺寸范围。
引用它是容器的引用类型。
const_reference它是常量容器的引用类型。

函数

通过函数,对象或变量可以在编程领域中发挥作用。队列提供了大量可用于或嵌入程序中的函数。以下是它们的列表:

函数描述
(构造函数)该函数用于构造队列容器。
empty该函数用于测试队列是否为空。如果队列为空,则函数返回 true,否则返回 false。
大小该函数返回队列容器的大小,这是队列中存储的元素数量的度量。
front该函数用于访问队列的队首元素。该元素起着非常重要的作用,因为所有删除操作都针对队首元素执行。
back该函数用于访问队列的队尾元素。该元素起着非常重要的作用,因为所有插入操作都针对队尾元素执行。
push该函数用于在队列的队尾插入新元素。
pop该函数用于删除元素;队列中的元素从队首删除。
emplace该函数用于在当前队尾元素上方插入新元素到队列中。
关系运算符非成员函数指定了队列所需的关系运算符。
swap该函数用于交换参考容器的内容。
uses allocator<queue>顾名思义,非成员函数用于队列的分配器。

执行基本队列功能的示例

让我们看一个简单的程序,展示 C++ 中基本队列函数的使用。

示例

编译并运行

输出

The queue fquiz is : 10 20 30
fquiz.size() : 3
fquiz.front() : 10
fquiz.back() : 30
fquiz.pop() : 20 30

说明

在此示例中,我们演示了 queue 容器及其函数,如 push()、pop()、front()、back() 和 size() 的用法。首先,它定义了一个名为 showsg() 的辅助函数来显示队列元素。之后,程序将元素添加到队列中,显示它们,显示其大小、队首和队尾元素,然后使用 pop() 函数移除队首元素。

队列上的基本操作

在 C++ 中,我们可以对队列执行 several 操作。其中一些如下:

1) 插入 (push())

在 C++ 中,插入操作将新元素放置在队列系统当前最后一个条目之后。插入过程不会修改队列队首位置的元素。在队列中插入元素的过程也称为入队 (Enqueue)。可以按顺序将多个元素添加到队列中。

语法

它具有以下语法:

C++ 插入队列元素的示例

让我们看一个程序,演示如何将元素插入队列。

示例

编译并运行

输出

Queue after insertion: 10 <- 30

说明

在此示例中,push() 函数在队尾添加元素。队列:10 <- 20 <- 30 front() 显示第一个元素 (10),back() 显示最后一个元素 (30)。

2) 删除 (pop())

队列的队首元素将是此操作要移除的第一个元素。它遵循 FIFO 规则。系统通过 pop() 函数通过每次操作处理并移除一个元素。

弹出元素不会提供被移除的值,因为它需要用户首先通过 front() 函数访问队首元素。从队列中移除元素的过程称为出队 (dequeuer)。

语法

它具有以下语法:

删除元素的示例

让我们看一个程序,演示如何删除队列中的元素。

示例

编译并运行

输出

Before pop, front = 10
After pop, new front = 20

说明

在此示例中,pop() 函数移除队首(第一个)元素。移除 10 后,下一个元素 (20) 成为新的队首。

3) 访问队首元素 (front())

此函数允许访问下一个将从队列中移除的队首元素。

语法

它具有以下语法:

C++ 访问队首元素的示例

让我们看一个程序,演示如何访问队列中的队首元素。

示例

编译并运行

输出

Front of the queue: Alice

说明

在此示例中,front() 函数显示第一个插入的元素。

4) 访问队尾元素 (back())

该方法允许访问队列中最新添加元素的引用。

语法

它具有以下语法:

让我们看一个程序,演示如何访问队列中的队尾元素。

示例

编译并运行

输出

Back of the queue: Bob

说明

在此示例中,back() 函数显示最近插入的元素。

5) 检查大小 (size())

该函数返回队列容器的大小,这是队列中存储的元素数量的度量。

语法

它具有以下语法:

C++ 检查大小的示例

让我们看一个程序,演示如何检查队列中元素的数量。

示例

编译并运行

输出

Queue size: 3

说明

在此示例中,size() 函数计算队列中存在的元素数量。

6) 检查队列是否为空 (empty())

该函数用于测试队列是否为空。当队列不包含任何元素时,该函数才返回 true,而在所有其他情况下都返回 false。

语法

它具有以下语法:

C++ 队列 empty() 函数的示例

让我们看一个程序,演示如何检查队列中的元素是否为空。

示例

编译并运行

输出

Queue is empty
Queue is not empty

说明

在此示例中,如果队列没有元素,empty() 函数将返回 true。

7) 遍历队列

队列需要遍历过程来显示从第一个到最后一个的所有元素。我们通过使用循环以及 front() 和 pop() 函数来遍历和打印队列元素,因为 std::queue 不支持迭代器。

遍历后队列变空,因为所有元素都已被移除。通过将原始队列复制到一个不同的临时队列中,然后使用这个新队列进行遍历,我们可以保留原始队列。

C++ 遍历队列的示例

让我们看一个程序,演示如何遍历队列中的元素。

示例

编译并运行

输出

Queue elements: 1 2 3

说明

在此示例中,我们每次都打印队首元素并执行 pop()。遍历结束后队列变空。

时间复杂度

下表显示了 C++ 中队列的 several 操作的时间复杂度。

操作时间复杂度
插入元素O(1)
删除元素O(1)
访问队首元素O(1)
访问队尾元素O(1)
遍历队列O(1)

结论

总而言之,C++ 中的队列作为基本数据结构,实现 FIFO 逻辑,按照到达顺序处理指令。通过 C++ 标准模板库 (STL) 的队列容器系统,开发人员可以高效地访问入队、出队和查看操作。

C++ 队列选择题

1) C++ STL 中队列的最佳描述是什么?

  1. LIFO(后进先出)数据结构
  2. 存储键值对元素的容器
  3. FIFO(先进先出)数据结构
  4. 动态数组容器
 

答案:c) FIFO(先进先出)数据结构


2) 关于 STD::queue 的以下哪个陈述是正确的?

  1. 可以使用索引随机访问元素
  2. 队列允许在两端进行插入和删除
  3. 元素从队首插入,从队尾删除
  4. 元素从队尾插入,从队首删除
 

答案:d) 元素从队尾插入,从队首删除


3) std::queue 的 empty() 函数返回什么?

  1. 队列中空槽的数量
  2. 队列中的最后一个元素
  3. 如果队列中有元素,则返回 true
  4. 如果队列中没有元素,则返回 true
 

答案:d) 如果队列中没有元素,则返回 true


4) 以下关于 std::queue 的哪个陈述不正确?

  1. 它是一个容器适配器
  2. 它支持元素的随机访问
  3. 它只允许在队尾插入
  4. 它定义在头文件中
 

答案:b) 它支持元素的随机访问


5) 以下哪个最能描述 std::queue 的内部结构?

  1. 一个容器适配器,它使用另一个容器,例如 deque 或 list
  2. 一个行为反转的堆栈
  3. 一个带有队首和队尾指针的动态数组
  4. 基于优先级的容器
 

答案:a) 一个容器适配器,它使用另一个容器,例如 Deque 或 List