优先级队列
今天,我们的任务是实现一个优先级队列。
具体实现如下:
Compare.h具体内容如下:
#include <iostream> using namespace std; 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; }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; };main.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(); cin.get(); return 0; }运行效果如图1所示:
图1 运行效果