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

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

队列入门详细介绍

队列是一种基础的数据结构,广泛用于各种编程问题。它遵循先进先出(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.mrgr.cn/news/7275.html

相关文章:

  • Vue中的methods方法与computed计算属性的区别
  • RTC碰到LXTAL低频晶振停振怎么办?
  • Java 中的 Tomcat 详解
  • mac苹果电脑搭建Python开发环境
  • StarRocks 存算分离数据回收原理
  • ZooKeeper的8大应用场景解析
  • SLAM学习笔记
  • DNS服务器的起点:根服务器
  • c语言利用if else制作信号灯程序
  • Elementui-Plus动态渲染图标icon
  • SQL Server中如何自动抓取阻塞
  • 分享一个基于python的租房数据分析与可视化系统Hadoop大数据源码(源码、调试、LW、开题、PPT)
  • 多模态大模型技术详解(图像分块、特征对齐)
  • 排序算法【快速排序】
  • jQuery实现前端下载功能
  • 医疗器械网络安全
  • 手机号归属地查询如何用Java进行调用
  • 从0到1学会nginx分布式框架
  • SpringBoot 读取配置文件的4种方式
  • C++ 设计模式——命令模式