优先级队列:优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。(优先权可根据具体形势具体定义)
优先级对列是堆的应用之一, 它的具体实现以堆为原型。
仿函数:
<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>
<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>
<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>