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

队列入门详细介绍

队列是一种基础的数据结构,广泛用于各种编程问题。它遵循先进先出(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 类实现的队列操作的详细示例。这个示例包括队列的创建、添加元素、删除元素和查看队列内容等步骤。

示例代码

cpp 复制代码
#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操作的场景,红黑树适用于高效查找和排序,而链表适合频繁的插入和删除操作。

相关推荐
懒惰才能让科技进步18 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
DARLING Zero two♡22 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
7年老菜鸡23 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Gu Gu Study24 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
Ni-Guvara32 分钟前
函数对象笔记
c++·算法
love_and_hope33 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
似霰36 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
Chef_Chen36 分钟前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++