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

队列入门详细介绍

队列是一种基础的数据结构,广泛用于各种编程问题。它遵循先进先出(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操作的场景,红黑树适用于高效查找和排序,而链表适合频繁的插入和删除操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值