priority_queue的模拟实现

//优先级队列
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值