Day 25 C++ 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 应用场景

任务调度

在多任务系统中,可以使用队列来管理待执行的任务。当新的任务到达时,将其加入队列末尾;执行任务时,从队列头部取出任务进行处理。这样可以按照任务的到达顺序依次执行,并保证公平性。

消息传递

在消息队列系统中,可以使用队列来传递消息。生产者将消息放入队列尾部,消费者从队列头部取出消息进行处理。这样可以实现异步通信,提高系统的可伸缩性和可靠性。

缓冲区

在数据处理过程中,可以使用队列作为缓冲区来平衡生产者和消费者之间的速度差异。生产者可以将数据放入队列,而消费者则从队列中取出数据进行处理。这样可以避免生产者和消费者直接交互,提高系统的性能和稳定性。

网络请求处理

在服务器端应用程序中,可以使用队列来处理客户端的请求。当有新的请求到达时,将其放入队列尾部,然后按照队列的顺序依次处理。这样可以避免同时处理大量请求导致系统负载过高,同时提高系统的响应速度。

线程池任务调度

在多线程编程中,可以使用队列来管理待执行的任务。将任务放入队列尾部,由线程池中的线程从队列头部取出任务进行执行。这样可以避免线程过多导致资源竞争和性能下降,实现任务的有序执行。

猜你喜欢

转载自blog.csdn.net/m0_74921567/article/details/132182482
今日推荐