C++的队列, 优先级队列

队列(Queue)

队列是一种先进先出的数据结构。在队列中,元素的添加(入队)通常在队列的一端进行,而元素的移除(出队)则在另一端进行。

C++标准模板库(STL)中的std::queue是一个容器适配器,它封装了一个底层容器(如std::dequestd::list)来实现队列的行为。

主要操作:
  • push(T value):在队列的尾部添加一个元素。

  • pop():移除队列头部的元素。

  • front():访问队列头部的元素,但不移除它。

  • back():访问队列尾部的元素,但不移除它。

  • empty():检查队列是否为空。

  • size():返回队列中的元素数量。

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;

    // 入队
    q.push(1);
    q.push(2);
    q.push(3);

    // 出队
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }

    return 0;
}

优先级队列(Priority Queue)

优先级队列是一种特殊的队列,其中每个元素都有一个优先级,出队操作总是移除优先级最高的元素。如果没有指定优先级,元素的顺序将由它们被插入的顺序决定。

C++标准模板库中的std::priority_queue是一个容器适配器,它使用堆(通常是二叉堆)来实现优先级队列的行为。默认情况下,std::priority_queue是一个最大堆,即优先级最高的元素(默认是最大的元素)首先被移除。如果需要最小堆,可以使用std::make_heapstd::push_heap等函数。

主要操作:
  • push(T value):在优先级队列中添加一个元素。

  • pop():移除优先级最高的元素。

  • top():访问优先级最高的元素,但不移除它。

  • empty():检查优先级队列是否为空。

  • size():返回优先级队列中的元素数量。

#include <iostream>
#include <queue>
#include <vector>
#include <functional>

int main() {
    // 默认是最大堆
    std::priority_queue<int> pq;

    // 入队
    pq.push(10);
    pq.push(20);
    pq.push(5);

    // 出队
    while (!pq.empty()) {
        std::cout << pq.top() << " ";
        pq.pop();
    }

    // 创建最小堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> minPq;

    // 入队
    minPq.push(10);
    minPq.push(20);
    minPq.push(5);

    // 出队
    while (!minPq.empty()) {
        std::cout << minPq.top() << " ";
        minPq.pop();
    }

    return 0;
}

在上述代码中,std::priority_queue默认是最大堆,而通过指定第三个模板参数std::greater<int>,可以创建一个最小堆。

总结来说,队列和优先级队列都是有序容器,但它们的访问和操作方式不同。队列遵循FIFO原则,而优先级队列则根据元素的优先级进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值