文章目录
- queue 基本概念
- 定义
- 注意
- 基本概念
- 队头(Front)——指向队列中最早添加的元素的位置。
- 队尾(Rear)——指向队列中最后添加的元素的位置。
- 入队(Enqueue)——将元素添加到队尾。
- 出队(Dequeue)——从队头移除元素。
- 队空(Empty)——当队列中没有任何元素时,称为队空。
- 队大小(Size)——表示队列中元素的数量。
- queue 常用接口
- 构造函数
- 赋值操作
- 数据存取
- 大小操作
- 示例
- 代码
- 分析
- 总结
- queue 应用场景
- 任务调度
- 消息传递
- 缓冲区
- 网络请求处理
- 线程池任务调度
queue 基本概念
定义
在C++中,队列(queue)是一种常见的数据结构,采用先进先出(First-In-First-Out,FIFO)的原则,它有两个出口。队列的特点是只允许在一端进行插入操作(队尾),在另一端进行删除操作(队头)。在队列中,只有最早添加的元素可以被访问和操作,而后续添加的元素需要等到前面的元素被处理完毕后才能被访问。
注意
在C++标准库中,可以使用std::queue
模板类来实现队列。需要引入头文件<queue>
队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
C++标准库中的队列(std::queue
)本身不提供直接的索引功能。由于队列是一种先进先出的数据结构,它的插入操作只能在队尾进行,删除操作只能在队头进行,不能像数组或向量那样通过索引来访问元素。
要实现带有索引功能的队列,可以使用其他数据结构来辅助实现,如向量(std::vector
)或链表(std::list
)
基本概念
队头(Front)——指向队列中最早添加的元素的位置。
队尾(Rear)——指向队列中最后添加的元素的位置。
入队(Enqueue)——将元素添加到队尾。
出队(Dequeue)——从队头移除元素。
队空(Empty)——当队列中没有任何元素时,称为队空。
队大小(Size)——表示队列中元素的数量。
queue 常用接口
构造函数
queue<T> que;
queue采用模板类实现,queue对象的默认构造形式queue(const queue &que);
拷贝构造函数
赋值操作
queue& operator=(const queue &que);
重载等号操作符
数据存取
push(elem);
往队尾添加元素pop();
从队头移除第一个元素back();
返回最后一个元素front();
返回第一个元素
大小操作
empty();
判断堆栈是否为空size();
返回栈的大小
示例
代码
#include <iostream>
#include <queue>
int main() {
std::queue<int> que;
// 往队尾添加元素
que.push(10);
que.push(20);
que.push(30);
// 返回第一个元素
std::cout << "队头元素为:" << que.front() << std::endl;
// 返回最后一个元素
std::cout << "队尾元素为:" << que.back() << std::endl;
// 移除第一个元素
que.pop();
// 再次返回第一个元素
std::cout << "队头元素为:" << que.front() << std::endl;
// 获取队列的大小
std::cout << "队列的大小为:" << que.size() << std::endl;
// 判断队列是否为空
if (que.empty()) {
std::cout << "队列为空" << std::endl;
}
return 0;
}
运行结果如下:
队头元素为:10
队尾元素为:30
队头元素为:20
队列的大小为:2
分析
这个例子创建了一个整型的队列对象std::queue que
然后通过push(elem)方法往队列的队尾依次添加元素10、20和30
使用front()方法可以获取队列的第一个元素的值
使用back()方法可以获取队列的最后一个元素的值
然后使用pop()方法移除队列的第一个元素
最后使用size()方法返回队列的大小
使用empty()方法判断队列是否为空。
总结
- 入队 — push
- 出队 — pop
- 返回队头元素 — front
- 返回队尾元素 — back
- 判断队是否为空 — empty
- 返回队列大小 — size
queue 应用场景
任务调度
在多任务系统中,可以使用队列来管理待执行的任务。当新的任务到达时,将其加入队列末尾;执行任务时,从队列头部取出任务进行处理。这样可以按照任务的到达顺序依次执行,并保证公平性。
消息传递
在消息队列系统中,可以使用队列来传递消息。生产者将消息放入队列尾部,消费者从队列头部取出消息进行处理。这样可以实现异步通信,提高系统的可伸缩性和可靠性。
缓冲区
在数据处理过程中,可以使用队列作为缓冲区来平衡生产者和消费者之间的速度差异。生产者可以将数据放入队列,而消费者则从队列中取出数据进行处理。这样可以避免生产者和消费者直接交互,提高系统的性能和稳定性。
网络请求处理
在服务器端应用程序中,可以使用队列来处理客户端的请求。当有新的请求到达时,将其放入队列尾部,然后按照队列的顺序依次处理。这样可以避免同时处理大量请求导致系统负载过高,同时提高系统的响应速度。
线程池任务调度
在多线程编程中,可以使用队列来管理待执行的任务。将任务放入队列尾部,由线程池中的线程从队列头部取出任务进行执行。这样可以避免线程过多导致资源竞争和性能下降,实现任务的有序执行。