今天,我们的任务是实现一个优先级队列。
具体实现如下:
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 运行效果