当前位置: 首页 > article >正文

数据结构之 队列入门 队列例程 队列例程分析

队列入门详细介绍

队列是一种基础的数据结构,广泛用于各种编程问题。它遵循先进先出(FIFO,First In First Out)原则,即最早插入的元素最早被移除。

特性
  1. 先进先出: 元素按照插入顺序出队。
  2. 队列头: 读取或移除最早插入的元素。
  3. 队列尾: 添加新元素到队列的末端。
  4. 队列操作:
    • enqueue(入队):将元素添加到队列尾部。
    • dequeue(出队):从队列头部移除元素。
    • front:访问队列头部元素但不移除。
    • empty:检查队列是否为空。
实现方式
  1. 数组实现:
    • 特点: 使用固定大小的数组来存储元素。
    • 优点: 访问速度快,内存局部性好。
    • 缺点: 队列容量固定,可能导致浪费或溢出。
    • 循环队列: 为了提高空间利用率,可使用环形数组。
队列种类
  1. 普通队列:

    • 特性: 仅支持一端入队,另一端出队。
    • 用途: 基本的FIFO操作。
  2. 双端队列(Deque):

    • 特性: 支持在队列的两端进行插入和删除。
    • 用途: 需要双端操作的应用场景,如双向任务调度。
  3. 优先队列:

    • 特性: 元素按照优先级出队,而不是按照插入顺序。
    • 用途: 实现任务调度系统,任务优先级处理。
应用场景
  1. 任务调度: 操作系统和应用程序中的任务调度使用队列来管理任务的执行顺序。
  2. 消息队列: 在异步系统中使用队列来保存和传递消息。
  3. 缓冲区管理: 在输入输出操作中,如网络数据传输或磁盘读写,使用队列作为缓冲区。
  4. 广度优先搜索: 图算法中的广度优先搜索(BFS)使用队列来追踪访问的节点。

下面是一个使用 C++ 标准库中的 std::queue 类实现的队列操作的详细示例。这个示例包括队列的创建、添加元素、删除元素和查看队列内容等步骤。

示例代码

#include <iostream>
#include <queue>

int main() {
    // 创建一个空队列
    std::queue<char> queue;

    // 操作步骤

    // 1. 添加元素到队列的尾部
    queue.push('A');
    queue.push('B');
    queue.push('C');

    // 2. 打印当前队列内容
    std::cout << "当前队列内容: ";
    std::queue<char> tempQueue = queue; // 使用临时队列打印内容
    while (!tempQueue.empty()) {
        std::cout << tempQueue.front() << " ";
        tempQueue.pop();
    }
    std::cout << std::endl;

    // 3. 从队列的头部移除元素
    char removedElement = queue.front();
    queue.pop();
    std::cout << "移除的元素: " << removedElement << std::endl;

    // 4. 打印移除后的队列内容
    std::cout << "移除后的队列内容: ";
    tempQueue = queue; // 使用临时队列打印内容
    while (!tempQueue.empty()) {
        std::cout << tempQueue.front() << " ";
        tempQueue.pop();
    }
    std::cout << std::endl;

    // 5. 再次添加元素到队列的尾部
    queue.push('D');
    queue.push('E');

    // 6. 打印最终队列内容
    std::cout << "最终队列内容: ";
    tempQueue = queue; // 使用临时队列打印内容
    while (!tempQueue.empty()) {
        std::cout << tempQueue.front() << " ";
        tempQueue.pop();
    }
    std::cout << std::endl;

    return 0;
}

操作步骤

  1. 创建一个空队列:使用 std::queue<char> queue; 创建一个新的空队列。
  2. 添加元素:使用 push() 方法将元素 ‘A’, ‘B’, 和 ‘C’ 依次添加到队列的尾部。
  3. 打印当前队列内容:使用一个临时队列 tempQueue 复制原队列并逐个输出队列中的元素,然后使用 pop() 移除已打印的元素。
  4. 移除元素:使用 front() 方法获取队列头部的元素,并使用 pop() 方法移除该元素。
  5. 打印移除后的队列内容:再次使用临时队列 tempQueue 复制移除元素后的队列并逐个输出队列中的元素。
  6. 再次添加元素:使用 push() 方法将元素 ‘D’ 和 ‘E’ 依次添加到队列的尾部。
  7. 打印最终队列内容:使用临时队列 tempQueue 复制最终队列并逐个输出队列中的元素。

输出结果

当前队列内容: A B C 
移除的元素: A
移除后的队列内容: B C 
最终队列内容: B C D E 

程序分析

  • 队列创建:队列使用 std::queue<char> 来存储字符元素,队列是先进先出的(FIFO)数据结构。
  • 元素添加:使用 push() 方法向队列尾部添加元素。
  • 元素移除:使用 pop() 方法从队列头部移除元素。front() 方法用于访问队列头部的元素但不移除。
  • 打印内容:由于队列的 pop() 方法会移除元素,为了打印内容,我们使用了一个临时队列 tempQueue 来保持原队列的内容不变。

通过这个示例,你可以了解到如何在 C++ 中使用 std::queue 进行基本的队列操作以及如何处理和查看队列中的数据。

对比其他数据结构
  1. 队列 vs 红黑树:

    • 优点: 队列操作简单,适用于FIFO任务。红黑树支持高效的查找、插入和删除,但不适用于FIFO操作。
    • 缺点: 队列缺乏排序和高效查找功能。红黑树实现复杂,对FIFO操作不适合。
  2. 队列 vs 链表:

    • 优点: 链表自然实现队列,支持动态大小,入队和出队操作高效。
    • 缺点: 链表的内存开销大于数组实现,且访问速度可能较慢。链表实现队列时,额外的内存和指针开销也需要考虑。

总体来说,队列适用于需要FIFO操作的场景,红黑树适用于高效查找和排序,而链表适合频繁的插入和删除操作。


http://www.kler.cn/news/284705.html

相关文章:

  • BaseCTF-Web-Week2-WP
  • 【自动化测试】处理页面加载元素过慢以及页面中存在frame框架页问题
  • Ableton Live 12 Suite:专业音乐制作的创新之选
  • 数据结构与算法——Java实现 3.二分查找——Java版
  • 激光雷达定位算法在FPGA中的实现——section2 全局坐标和角度计算
  • 小程序全局挂载对像
  • SQL经典五十道选刷
  • ffmpeg各模块常用组件源码位置
  • C++(1)基础语法
  • 【3.6】贪心算法-解救生艇问题
  • 目标检测之困难目标检测任务综述
  • SpringBoot异常处理原理分析
  • JMeter 工具安装以及简单使用
  • 人工智能再次进化 善用AI提升营运效率
  • 力扣234题详解:回文链表的多种解法与模拟面试问答
  • scrapy学习笔记0828-下
  • 《自然语言处理》—— 词向量之CountVectorizer方法实现
  • raksmart机云大宽带服务器托管服务内容
  • 安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?
  • PhpStorm2024版设置自动换行(软换行)
  • 2024.8.31 Python,合并区间,用sort通过列表第一个元素给列表排序,三数之和,跳跃游戏
  • AcWing 897. 最长公共子序列
  • JVM 内存参数
  • JetBrains WebStorm 2024.2 (macOS, Linux, Windows) - 最智能的 JavaScript IDE
  • 合宙LuatOS开发板使用手册——Air700EAQ
  • 图像边缘检测Canny
  • HTTP 之 Web Sockets处理恶意的Payload的策略(十一)
  • const、inline、nullptr的使用
  • Android Activity 的启动模式(Launch Mode)
  • Vue 2 vs Vue 3:v-if 和 v-for 的差异