优先级队列

1.概念:
优先级队列允许用户以任何次序将任何元素堆入容器内,但取出时一定是从优先权最高的(也就是数值最高)的元素开始取,binary max heap正是具有这样的性质,适合作为优先级队列的底层结构。

所谓binary heap就是一种完全二叉树,正操二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。

那么堆算法在STL中的是:push_heap算法,pop_heap算法、sort_heap算法、make_heap算法(建堆).
make_heap算法用来将一段现有的数据转换为一个heap.

优先级队列是一个拥有权限观念的队列,它允许加入新元素、移除旧元素、审视元素值等功能,由于这是一个queue,所以它只允许在底端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径。其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列,权值最高者,排在最前面。
这里写图片描述
缺省情况下优先级队列利用一个max_heap完成,后者是一个以vector表现得完全二叉树,大堆可以满足优先级队列所需要的”依权值高低自动递减排序”的特性。
2.优先级队列定义完整列表
由于优先级队列完全以底部容器为依据,再加上heap处理规则,缺省情况下是以vector为底部容器。将其称为容器配接器(container adapter).

优先级队列中没有迭代器。

3.优先级队列的使用

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
    int a[] = { 0, 1, 2, 3, 4, 8, 9, 3, 5 };
    priority_queue<int>q(a, a + 9);//
    cout << "size=" << q.size() << endl;

    for (int i = 0; i < q.size(); i++)
    {
        cout << q.top() << " ";//求出堆顶元素
    }
    cout << endl;

    while (!q.empty())
    {
        cout << q.top() << " ";
        q.pop();
    }
    cout << endl;
    system("pause");
    return 0;
}

这里写图片描述
4.优先级队列的实现(底层是堆结构)

#include"heap.h"
template<class T>
class Priority_queue
{
public:
    Priority_queue()
    {}
    void push(const T&data)
    {
        hp.push(data);
    }
    void pop()
    {
        hp.pop();
    }
    size_t size()
    {
        return hp.size();
    }
    Heap<T,Compa>hp;
};
int main()
{
    Priority_queue<int>p;
    p.push(1);
    p.push(2);
    cout << p.size() << endl;
    p.pop();
    cout << p.size() << endl;
    system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值