数据结构--优先级队列

优先级队列:优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。(优先权可根据具体形势具体定义)

优先级对列是堆的应用之一, 它的具体实现以堆为原型。


仿函数:

<span style="font-size:18px;">//仿函数比较小
template<class T>
struct Less
{
	bool operator() (const T& l, const T& r)
	{
		return l < r;
	}
};
//仿函数比较大
template<class T>
struct Greater
{
	bool operator() (const T& l, const T& r)
	{
		return l > r;
	}
};</span>

堆:

<span style="font-size:18px;">//template<class T, class Compare = Less<T>>
//适配器模式  默认为Less比较模式
template<class T, template<class> class Compare = Less>
class Heap
{
public:
	//无参构造函数
	Heap()
	{}
	//带参
	Heap(const T* a, size_t size)
	{
		_a.reserve(size);  //先开辟空间
		for (size_t i = 0; i < size; ++i)
		{
			_a.push_back(a[i]);  //push 数据
		}

		// 建堆
		for (int i = (_a.size() - 2) / 2; i >= 0; --i)
		{
			_AdjustDown(i);  //从第一个非叶子节点下调
		}
	}
	//
	Heap(vector<T>& a)
	{
		_a.swap(a);  //交换两个vector

		// 建堆
		for (int i = (_a.size() - 2) / 2; i >= 0; --i)
		{
			_AdjustDown(i);
		}
	}

	//插入数据
	void Push(const T& x)
	{
		_a.push_back(x); //尾插

		_AdjustUp(_a.size() - 1); //上调  从下向上进行调整
	}
	//pop数据
	void Pop()
	{

		size_t size = _a.size();
		assert(size > 0); //防御式编程

		swap(_a[0], _a[size - 1]);  //交换两个数据
		_a.pop_back();  //尾删
		_AdjustDown(0);  //上调
	}
	//取堆顶元素
	T& Top()
	{
		assert(!_a.empty());
		return _a[0];
	}

	size_t Size()
	{
		assert(_a.size() > 0);
		return _a.size();
	}
	bool Empty()
	{
		return _a.size() == 0;
	}


	void Print()
	{
		for (int i = 0; i < _a.size(); i++)
		{
			cout << _a[i] << "  ";
		}
		cout << endl;
	}


protected:
	//上调
	void _AdjustUp(int child)
	{
		int parent = (child - 1) / 2;
		//while(parent>=0)
		while (child > 0)
		{
			Compare<T> com;  //会调用相应的仿函数进行比较,
			//Compare com;
			//if (_a[child] > _a[parent])
			if (com(_a[child], _a[parent]))  //如果满足各自的条件,就进行交换,然后在继续
			{
				swap(_a[child], _a[parent]);
				child = parent;
				parent = (child - 1) / 2;
			}
			else
			{
				break;
			}
		}
	}

	void _AdjustDown(size_t parent)
	{
		size_t child = parent * 2 + 1;
		while (child < _a.size())
		{
			// 选出孩子里面大的那一个
			//Compare com;
			Compare<T> com;
			//if (child+1 < _a.size() &&_a[child+1] > _a[child])
			if (child + 1 < _a.size()
				&& com(_a[child + 1], _a[child]))
			{
				++child;
			}

			// 如果父亲小于孩子,则交换并继续往下调整
			// 否则调堆完成

			//if(_a[child] > _a[parent])
			if (com(_a[child], _a[parent]))
			{
				swap(_a[parent], _a[child]);
				parent = child;
				child = 2 * parent + 1;
			}
			else
			{
				break;
			}
		}
	}

protected:

	vector<T> _a;
};</span>

优先级对列:

<span style="font-size:18px;">//优先级队列  默认以小的优先级高
template <class T, template<class> class Compare = Less>
class PriorityQueue
{
public:
	void Push(const T& x)
	{
		_hp.Push(x);
	}

	void Pop()
	{
		_hp.Pop();
	}

	T& Top()
	{
		return _hp.Top();
	}

	size_t Size()
	{
		return _hp.Size() ;
	}
	bool Empty()
	{
		return _hp.Size() == 0;
	}

	void Print()
	{
		_hp.Print();
	}

protected:
	Heap<T, Compare> _hp;
};
</span>



测试用例1:

<span style="font-size:18px;">void Test1()
{
	int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 };
	PriorityQueue<int, Greater> p;
	p.Push(10);
	p.Push(11);
	p.Push(13);
	p.Push(12);
	p.Push(16);
	p.Push(18);
	p.Push(15);
	p.Push(17);
	p.Push(14);
	p.Push(19);
	p.Print();
	cout << p.Empty() << endl;
	cout << p.Size() << endl;
	cout << p.Top() << endl;
}
</span>

测试用例2:

<span style="font-size:18px;">void Test2()
{
	int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 };
	PriorityQueue<int, Greater> p;
	p.Push(10);
	p.Push(11);
	p.Push(13);
	p.Push(12);
	p.Push(16);
	p.Push(18);
	p.Push(15);
	p.Push(17);
	p.Push(14);
	p.Push(19);

	p.Print();
	p.Pop();
	p.Print();
	p.Pop();
	p.Print();
	p.Pop();
	p.Print();
	p.Pop();
	p.Print();
	p.Pop();
	p.Print(); 
	p.Pop();
	p.Print();
	p.Pop();
	p.Print(); 
	p.Pop();
	p.Print(); 
	p.Pop();
	p.Print();
	p.Pop();
	p.Print();
	

}</span>



仿函数测试用例:

<span style="font-size:18px;">void TestFuner()
{
	Less<int> less;
	cout << less(1, 2) << endl;
	cout << less(3, 2) << endl;
	cout << less(4, 2) << endl;
	cout << less(-1, 2) << endl;
	cout << "-------" << endl;;
	Greater<int> greater;
	cout << greater(1, 2) << endl;
	cout << greater(3, 2) << endl;
	cout << greater(4, 2) << endl;
	cout << greater(-1, 2) << endl;
}
</span>









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值