优先级队列

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

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

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

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

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

3.优先级队列的使用

#include
#include
#include
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();
    }
    Heaphp;
};
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;
}

你可能感兴趣的:(数据结构)