QueueNode.h
template<typename Type,typename Cmp> class PriorityQueue; template<typename Type,typename Cmp> class QueueNode{ private: friend class PriorityQueue<Type,Cmp>; QueueNode(const Type item,QueueNode<Type,Cmp> *next=NULL) :m_data(item),m_pnext(next){} private: Type m_data; QueueNode<Type,Cmp> *m_pnext; };
Compare.h
template<typename Type> class Compare{ //处理一般比较大小 public: static bool lt(Type item1,Type item2); }; template<typename Type> bool Compare<Type>::lt(Type item1, Type item2){ return item1<item2; } struct SpecialData{ friend ostream& operator<<(ostream& ,SpecialData &); int m_ntenor; int m_npir; }; ostream& operator<<(ostream& os,SpecialData &out){ os<<out.m_ntenor<<" "<<out.m_npir; return os; } class SpecialCmp{ //处理特殊比较大小,用户可添加适当的类 public: static bool lt(SpecialData item1,SpecialData item2); }; bool SpecialCmp::lt(SpecialData item1, SpecialData item2){ return item1.m_npir<item2.m_npir; }
PriorityQueue.h
#include "QueueNode.h" #include "Compare.h" template<typename Type,typename Cmp> class PriorityQueue{ //Cmp is Designed for compare public: PriorityQueue():m_prear(NULL),m_pfront(NULL){} ~PriorityQueue(){ MakeEmpty(); } void MakeEmpty(); //make the queue empty void Append(const Type item); //insert data Type Delete(); //delete data Type GetFront(); //get data void Print(); //print the queue bool IsEmpty() const{ return m_pfront==NULL; } private: QueueNode<Type,Cmp> *m_prear,*m_pfront; }; template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::MakeEmpty(){ QueueNode<Type,Cmp> *pdel; while(m_pfront){ pdel=m_pfront; m_pfront=m_pfront->m_pnext; delete pdel; } } template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Append(const Type item){ if(m_pfront==NULL){ m_pfront=m_prear=new QueueNode<Type,Cmp>(item); } else{ m_prear=m_prear->m_pnext=new QueueNode<Type,Cmp>(item); } } template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::Delete(){ if(IsEmpty()){ cout<<"There is no elements!"<<endl; exit(1); } QueueNode<Type,Cmp> *pdel=m_pfront,*pmove=m_pfront; while(pmove->m_pnext){ //get the minimize priority's data //cmp:: lt is used for compare the two data, if the front one // is less than the back, then return 1 if(Cmp::lt(pmove->m_pnext->m_data,pdel->m_pnext->m_data)){ pdel=pmove; } pmove=pmove->m_pnext; } pmove=pdel; pdel=pdel->m_pnext; pmove->m_pnext=pdel->m_pnext; Type temp=pdel->m_data; delete pdel; return temp; } template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::GetFront(){ if(IsEmpty()){ cout<<"There is no elements!"<<endl; exit(1); } QueueNode<Type,Cmp> *pdel=m_pfront,*pmove=m_pfront->m_pnext; while(pmove){ //get the minimize priority's data if(Cmp::lt(pmove->m_data,pdel->m_data)){ pdel=pmove; } pmove=pmove->m_pnext; } return pdel->m_data; } template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Print(){ QueueNode<Type,Cmp> *pmove=m_pfront; cout<<"front"; while(pmove){ cout<<"--->"<<pmove->m_data; pmove=pmove->m_pnext; } cout<<"--->rear"<<endl<<endl<<endl; }
Test.cpp
#include <iostream> #include <cstdlib> using namespace std; #include "PriorityQueue.h" int main(){ PriorityQueue<int,Compare<int> > queue; int init[10]={1,9,3,5,0,8,2,4,6,7}; for(int i=0;i<10;i++){ queue.Append(init[i]); } queue.Print(); queue.Delete(); queue.Print(); system("pause"); system("cls"); PriorityQueue<SpecialData,SpecialCmp> spe_queue; int init2[5][2]={{34,2},{64,1},{18,3},{24,2},{55,4}}; SpecialData data[5]; for(int i=0;i<5;i++){ data[i].m_npir=init2[i][1]; data[i].m_ntenor=init2[i][0]; } for(int i=0;i<5;i++){ spe_queue.Append(data[i]); } spe_queue.Print(); cout<<spe_queue.GetFront()<<endl<<endl; spe_queue.Delete(); spe_queue.Print(); return 0; }