zoukankan      html  css  js  c++  java
  • 优先级队列

    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;
    }
    
  • 相关阅读:
    在同一台机器上让Microsoft SQL Server 2000/ SQL2005/ SQL2008共存
    HTML 中<style>中</style>里面<!-- -->标签是干嘛的
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    怎样清除td和input之间空隙
    aspx页面中, <%= % > 与 <%# % > 的区别
    python之day13(ORM,paramiko模块,堡垒机)
    python之day12(线程池,redis,rabbitMQ)
    RabbitMQ与SQLAlchemy(预习)
    redis操作篇
    python之day11(线程,进程,协程,memcache,redis)
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2438211.html
Copyright © 2011-2022 走看看