重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
代码按照适配器模式实现,若理解了堆的内部怎么实现的,那优先级的队列实现则是非常简单的了,堆的设计大家不明白的话,可以查看我的博客http://10740184.blog.51cto.com/10730184/1767076。
创新互联是一家专注于成都网站制作、做网站与策划设计,茂名网站建设哪家好?创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:茂名等地区。茂名做网站价格咨询:13518219792
建立PriorityQueue.hpp:
#define _CRT_SECURE_NO_WARNINGS 1 #includeusing namespace std; #include #include template struct Less { bool operator() (const T& l, const T& r) { return l < r; } }; template struct Greater { bool operator() (const T& l, const T& r) { return l>r; } }; template class Compare=Less> class Heap { public: Heap() :_a(NULL) {} Heap(const T* a,size_t size) { for (int i = 0; i < size; i++) { _a.push_back(a[i]); } for (int i = (size - 2) / 2; i >= 0; i--) { _adjustDown(i); } } void _adjustDown(size_t parent) { Compare com; size_t child = 2 * parent + 1; size_t size = _a.size(); while (child com; while (child>0) { if (com(_a[child],_a[parent])) { swap(_a[parent], _a[child]); child = parent; parent = (child - 1) / 2; } else { break; } } } size_t Size() { size_t size = _a.size(); return size; } bool Empty() { assert(Size() >= 0); return Size() == 0; } void Pop() { assert(_a.Size() > 0); swap(_a[0], _a[Size - 1]); _a.pop_back(); _adjustDown(0); } T& GetTop() { return _a[0]; } void Print() { cout << "大堆序列:" << endl; for (int i = 0; i < _a.size(); i++) { cout << _a[i] << " "; } cout << endl; } public: vector _a; }; template class Compare = Less> class PriorityQueue { public: void Push(const T& x) { _hp.Push(x); } void Pop() { _hp.Pop(); } size_t Size() { return _hp.Size(); } bool Empty() { _hp.Empty(); } T& Top() { return _hp.GetTop(); } void Print() { _hp.Print(); } private: Heap _hp; };
建立PriorityQueue.cpp文件:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include "PriorityQueue.hpp" void Test() { int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; PriorityQueuepq; pq.Push(10); pq.Push(11); pq.Push(13); pq.Push(12); pq.Push(16); pq.Push(18); pq.Push(15); pq.Push(17); pq.Push(14); pq.Push(19); pq.Print(); } int main() { Test(); system("pause"); return 0; }