什么是优先队列?
在计算机科学中,**优先队列(Priority Queue)**是一种特殊的数据结构,它能够保证每次从队列中取出的元素都是具有最高(或最低)优先级的元素。
优先队列的功能
插入元素:通过使用成员函数push(),可以将一个元素插入到优先级队列中。插入操作会根据元素的优先级进行排序,保证队列中的元素始终按照优先级从高到低的顺序排列。
//插入元素
void push(const T& x)
{//将元素插入到底层容器c的尾部//并通过std::push_heap函数将元素重新调整到合适的位置,以保持堆的性质。c.push_back(x);std::push_heap(c.begin(), c.end(), comp);
}
访问元素:通过使用成员函数top(),可以获取当前优先级最高的元素,而不会改变队列的内容。这样可以方便地查看队列中的最高优先级元素。
//返回队列的首元素
T& top()
{return c.front();
}
删除元素:通过使用成员函数pop(),可以删除当前优先级最高的元素。删除操作会重新调整队列中元素的顺序,确保下一个最高优先级元素能够被访问到。
//删除元素
void pop()
{//通过std::pop_heap函数将首元素和尾元素互换位置//并通过c.pop_back()删除尾元素,最后使得底层容器c仍然保持堆的性质。std::pop_heap(c.begin(), c.end(), comp);c.pop_back();
}
大小和判空:通过使用成员函数size(),可以获取当前队列中的元素个数;使用成员函数empty(),可以判断队列是否为空。
//判断是否为空
bool empty() const
{return c.empty();
}
//返回元素的个数
size_t size() const
{return c.size();
}
完整代码【实现+测试】
#include <iostream>
#include <vector>
#include<algorithm>
#include<iostream>
#include <functional>
using namespace std;
namespace bit
{//T为元素类型//Container为底层容器类型,默认为vector//Compare为比较函数类型,默认为lesstemplate <class T, class Container = std::vector<T>, class Compare = std::less<T> >class priority_queue{public://默认构造函数,什么也不做priority_queue() {}//接受两个迭代器参数的构造函数//用于将一个范围内的元素插入到priority_queue中// 并在构造完成后通过make_heap函数将元素堆化template <class InputIterator>priority_queue(InputIterator first, InputIterator last){c.insert(c.end(), first, last);std::make_heap(c.begin(), c.end(), comp);}//判断是否为空bool empty() const {return c.empty(); }//返回元素的个数size_t size() const {return c.size(); }//返回队列的首元素T& top() {return c.front(); }//插入元素void push(const T& x){//将元素插入到底层容器c的尾部//并通过std::push_heap函数将元素重新调整到合适的位置,以保持堆的性质。c.push_back(x);std::push_heap(c.begin(), c.end(), comp);}//删除元素void pop(){//通过std::pop_heap函数将首元素和尾元素互换位置//并通过c.pop_back()删除尾元素,最后使得底层容器c仍然保持堆的性质。std::pop_heap(c.begin(), c.end(), comp);c.pop_back();}private://Container类型的成员变量c,用于存储元素Container c;//Compare类型的成员变量comp,用于比较元素的优先级Compare comp;};
}int main()
{//元素按从大到小的顺序排列bit::priority_queue<int, std::vector<int>, std::greater<int>> pq;pq.push(3);pq.push(55);pq.push(1);pq.push(2);pq.push(5);//当priority_queue不为空时,依次输出pq.top()的值,并通过pq.pop()方法删除该元素while (!pq.empty()){std::cout << pq.top() << " ";pq.pop();}std::cout << std::endl;return 0;
}