建立PriorityQueue.hpp:
#define_CRT_SECURE_NO_WARNINGS1 #include<iostream> usingnamespacestd; #include<assert.h> #include<vector> template<classT> structLess { booloperator()(constT&l,constT&r) { returnl<r; } }; template<classT> structGreater { booloperator()(constT&l,constT&r) { returnl>r; } }; template<classT,template<class>classCompare=Less> classHeap { public: Heap() :_a(NULL) {} Heap(constT*a,size_tsize) { for(inti=0;i<size;i++) { _a.push_back(a[i]); } for(inti=(size-2)/2;i>=0;i--) { _adjustDown(i); } } void_adjustDown(size_tparent) { Compare<T>com; size_tchild=2*parent+1; size_tsize=_a.size(); while(child<size) { if(child+1<size&&com(_a[child+1],_a[child])) { ++child; } if(com(_a[child],_a[parent])) { swap(_a[child],_a[parent]); parent=child; child=2*parent+1; } else { break; } } } voidPush(constT&x) { _a.push_back(x); _adjustUp(_a.size()-1); } void_adjustUp(size_tchild) { intparent=(child-1)/2; Compare<T>com; while(child>0) { if(com(_a[child],_a[parent])) { swap(_a[parent],_a[child]); child=parent; parent=(child-1)/2; } else { break; } } } size_tSize() { size_tsize=_a.size(); returnsize; } boolEmpty() { assert(Size()>=0); returnSize()==0; } voidPop() { assert(_a.Size()>0); swap(_a[0],_a[Size-1]); _a.pop_back(); _adjustDown(0); } T&GetTop() { return_a[0]; } voidPrint() { cout<<"大堆序列:"<<endl; for(inti=0;i<_a.size();i++) { cout<<_a[i]<<""; } cout<<endl; } public: vector<T>_a; }; template<classT,template<class>classCompare=Less> classPriorityQueue { public: voidPush(constT&x) { _hp.Push(x); } voidPop() { _hp.Pop(); } size_tSize() { return_hp.Size(); } boolEmpty() { _hp.Empty(); } T&Top() { return_hp.GetTop(); } voidPrint() { _hp.Print(); } private: Heap<T,Compare>_hp; };
建立PriorityQueue.cpp文件:
#define_CRT_SECURE_NO_WARNINGS1 #pragmaonce #include"PriorityQueue.hpp" voidTest() { inta[]={10,11,13,12,16,18,15,17,14,19}; PriorityQueue<int,Greater>pq; 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(); } intmain() { Test(); system("pause"); return0; }