源代码
//queue.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
namespace my_priority_queue {
//仿函数
template <class T>
class greater {
public:
bool operator()(const T& x, const T& y)
{
return x > y;
}
};
//仿函数
template <class T>
class less {
public:
bool operator()(const T& x, const T& y)
{
return x < y;
}
};
template <class T,class Container=vector<T>,class Compare = less<T>>//默认的仿函数为less,控制优先级队列为大堆
class priority_queue {
public:
//向上调整算法
void AdjustUp(int child)
{
Compare com;//仿函数对象
int parent = (child - 1) / 2;
//while (_con[child] > _con[parent] && child > 0)//孩子结点比父亲结点大
while (com(_con[parent], _con[child]) && child > 0)//孩子结点比父亲结点大
{
//交换父亲结点和孩子结点的数据
T tmp = _con[child];
_con[child] = _con[parent];
_con[parent] = tmp;
//父亲结点和孩子结点下标重置
child = parent;
parent = (child - 1) / 2;
}
}
//向下调整算法
void AdjustDown(size_t parent)
{
Compare com;//仿函数对象
size_t child = parent * 2 + 1;
while (child < _con.size())
//while (com(child,_con.size())
{
if (child + 1 < _con.size())//存在右孩子
//if(com(child+1,_con.size())
{
//if (_con[child + 1] > _con[child])//右孩子比左孩子大,用右孩子顶替父亲结点位置
if (com(_con[child], _con[child + 1]))
{
child = child + 1;
}
}
//if (_con[child] > _con[parent])
if (com(_con[parent], _con[child]))
{
//交换父亲结点与孩子结点
T tmp = _con[child];
_con[child] = _con[parent];
_con[parent] = tmp;
//重置父亲结点和孩子结点
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
public:
//插入
void push(const T& val)
{
_con.push_back(val);
AdjustUp(_con.size() - 1);//向上调整
}
//删除
void pop()
{
swap(_con.front(),_con.back());//交换堆顶、堆底元素
//swap(_con[0], _con[_con.size() - 1]);
_con.pop_back();
AdjustDown(0);//向下调整
}
//判空
bool empty()
{
return _con.empty();
}
//大小
size_t size()
{
return _con.size();
}
//堆顶元素
const T& top()
{
return _con.front();
//return _con[0];
}
private:
Container _con;
};
}
//test.cpp
//大堆
void priority_queue_test()
{
my_priority_queue::priority_queue<int> pq;
pq.push(3);
pq.push(5);
pq.push(2);
pq.push(4);
pq.push(1);
pq.push(6);
while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
}
cout << endl;
}
//小堆
void priority_queue_test2()
{
my_priority_queue::priority_queue<int,vector<int>,my_priority_queue::greater<int>> pq;
pq.push(3);
pq.push(5);
pq.push(2);
pq.push(4);
pq.push(1);
pq.push(6);
while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
}
cout << endl;
}
int main()
{
priority_queue_test();
priority_queue_test2();
return 0;
}