C++如何实现优先队列

发布时间:2022-06-20 09:30:32 作者:iii
来源:亿速云 阅读:136

C++如何实现优先队列

优先队列(Priority Queue)是一种特殊的队列,其中的元素按照优先级顺序出队,而不是按照先进先出的顺序。优先队列通常用于任务调度、事件模拟等场景。在C++中,优先队列可以通过标准库中的std::priority_queue来实现,也可以手动实现一个优先队列。

使用std::priority_queue

C++标准库提供了std::priority_queue模板类,它位于<queue>头文件中。std::priority_queue默认是一个最大堆,即优先级最高的元素(最大值)位于队列的顶部。

基本用法

#include <iostream>
#include <queue>

int main() {
    // 创建一个最大堆优先队列
    std::priority_queue<int> pq;

    // 插入元素
    pq.push(10);
    pq.push(30);
    pq.push(20);

    // 访问顶部元素
    std::cout << "Top element: " << pq.top() << std::endl; // 输出 30

    // 删除顶部元素
    pq.pop();

    // 再次访问顶部元素
    std::cout << "Top element after pop: " << pq.top() << std::endl; // 输出 20

    return 0;
}

自定义比较函数

如果你想实现一个最小堆,可以通过自定义比较函数来实现。std::priority_queue的第三个模板参数可以指定比较函数。

#include <iostream>
#include <queue>
#include <vector>
#include <functional> // 用于 std::greater

int main() {
    // 创建一个最小堆优先队列
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

    // 插入元素
    pq.push(10);
    pq.push(30);
    pq.push(20);

    // 访问顶部元素
    std::cout << "Top element: " << pq.top() << std::endl; // 输出 10

    // 删除顶部元素
    pq.pop();

    // 再次访问顶部元素
    std::cout << "Top element after pop: " << pq.top() << std::endl; // 输出 20

    return 0;
}

手动实现优先队列

虽然std::priority_queue非常方便,但有时我们可能需要手动实现一个优先队列,以便更好地理解其工作原理或满足特定需求。优先队列通常基于堆(Heap)数据结构来实现。

基于数组的堆实现

下面是一个简单的基于数组的最大堆实现:

#include <iostream>
#include <vector>

class MaxHeap {
private:
    std::vector<int> heap;

    void heapifyUp(int index) {
        while (index > 0) {
            int parent = (index - 1) / 2;
            if (heap[index] > heap[parent]) {
                std::swap(heap[index], heap[parent]);
                index = parent;
            } else {
                break;
            }
        }
    }

    void heapifyDown(int index) {
        int size = heap.size();
        while (true) {
            int leftChild = 2 * index + 1;
            int rightChild = 2 * index + 2;
            int largest = index;

            if (leftChild < size && heap[leftChild] > heap[largest]) {
                largest = leftChild;
            }
            if (rightChild < size && heap[rightChild] > heap[largest]) {
                largest = rightChild;
            }

            if (largest != index) {
                std::swap(heap[index], heap[largest]);
                index = largest;
            } else {
                break;
            }
        }
    }

public:
    void push(int value) {
        heap.push_back(value);
        heapifyUp(heap.size() - 1);
    }

    void pop() {
        if (heap.empty()) return;
        heap[0] = heap.back();
        heap.pop_back();
        heapifyDown(0);
    }

    int top() {
        if (heap.empty()) throw std::out_of_range("Heap is empty");
        return heap[0];
    }

    bool empty() {
        return heap.empty();
    }
};

int main() {
    MaxHeap pq;

    pq.push(10);
    pq.push(30);
    pq.push(20);

    std::cout << "Top element: " << pq.top() << std::endl; // 输出 30

    pq.pop();

    std::cout << "Top element after pop: " << pq.top() << std::endl; // 输出 20

    return 0;
}

解释

总结

C++中的优先队列可以通过std::priority_queue轻松实现,也可以通过手动实现堆结构来满足特定需求。优先队列在算法和数据结构中有着广泛的应用,理解其实现原理对于编写高效的代码非常重要。

推荐阅读:
  1. c++优先队列的用法有哪些
  2. python实现最大优先队列

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:boost.asio框架系列之buffer函数怎么使用

下一篇:boost字符串处理函数format怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》