在计算机科学中,**优先队列(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
#include
#include
#include
#include
using namespace std;
namespace bit
{
//T为元素类型
//Container为底层容器类型,默认为vector
//Compare为比较函数类型,默认为less
template <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;
}