//优先级队列
#include<iostream>
using namespace std;
//priority_queue的模板参数: T--元素类型,Container--底层数据结构(默认为vector),Compare--比较方式(大堆/小堆---less/greater-默认为less)
template<class T, class Container = vector<T>, class Compare = less<T>>
class priority_queue
{
public:
priority_queue()
:con()
{}
template<class Iterator>
priority_queue(Iterator first, Iterator last)
: con(first, last)
{
int rear = con.size();
int node = ((rear - 2) >> 1);
for (; node >= 0; --node)
{
AdjustDown(node);
}
}
//尾插,以插入位置开始,向上调整
void push(const T& x)
{
con.push_back(x);
AdjustUp(con.size() - 1);
}
//根和最后一个孩子交换,删除交换后处于最后位置的根,以交换后处于堆顶的孩子开始,向下调整
void pop()
{
if (con.empty())
{
return;
}
swap(con.front(), con.back());
con.pop_back();
AdjustDown(0);
}
bool empty()
{
return con.empty();
}
size_t size()
{
return con.size();
}
size_t size()const
{
return con.size();
}
T& top()
{
return con.front();
}
private:
//向上调整算法
void AdjustUp(int child)
{
//父的下标
size_t parent = (child - 1) >> 1;
while (child != 0)
{
//父子比较
if (cmp(con[parent], con[child]))
{
swap(con[child], con[parent]);
child = parent;
parent = (child - 1) >> 1;
}
else
{
return;
}
}
}
//向下调整算法
void AdjustDown(int parent)
{
//当前为左孩子
size_t child = parent * 2 + 1;
while (child < con.size())
{
//找值相比较大的孩子
if (child + 1 < con.size() && cmp(con[child + 1], con[child]))
{
//右孩子较大
child += 1;
}
//父子比较
if (cmp(con[parent], con[child]))
{
swap(con[child], con[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
return;
}
}
}
private:
Container con;
Compare cmp;
};
#include<vector>
#include<functional>
void TestPQ()
{
// 8 1 9 3 6 4 5 0 2 7
int array[] = { 8, 1, 9, 3, 6, 4, 5, 0, 2, 7 };
priority_queue<int> q(array, array + sizeof(array) / sizeof(array[0]));
q.pop();
priority_queue<int, vector<int>, less<int>> q2;
q2.push(5);
q2.push(0);
q2.push(9);
q2.push(3);
q2.push(4);
}
int main()
{
TestPQ();
return 0;
}
priority_queue的模拟实现
最新推荐文章于 2024-04-10 18:22:06 发布