最小优先级队列(数组表示)

 

#ifndef PQUEUE_H

#define PQUEUE_H

 

#include <iostream>

#include <assert.h>

 

const int DefaultPQSize = 50;    //优先级队列数组的默认长度

 

template<class T>

class PQueue

{

public:

     PQueue(int sz = DefaultPQSize);

     ~PQueue()

     {

         delete []pqelements;

     }

     bool Insert(const T& x);    //将新元素x插入到队尾

     bool RemoveMin(T& x);  //将队头元素删去

     bool GetFront(T& x)const;   //读取队头元素(具最小优先权)的值

     void MakeEmpty()   //置优先级队列为空

     {

         count = 0;

     }

     bool IsEmtpy()const

     {

         return (count == 0) ? true : false;

     }

     bool IsFull()const

     {

         return (count == maxSize) ? true : false;

     }

     int GetSize()const //求优先级队列中元素的个数

     {

         return count;

     }

protected:

     T *pqelements;     //优先级队列数组

     int count;    //当前元素个数

     int maxSize;  //队列最大可容纳元素个数

     void adjust();     //队列调整

};

 

template<class T>

PQueue<T>::PQueue(int sz /* = DefaultPQSize */):maxSize(sz),count(0)

{

     pqelements = new T[maxSize];

     assert(pqelements != NULL);

}

 

template<class T>

bool PQueue<T>::Insert(const T &x)

{

     if(count == maxSize)

         return false;

     pqelements[count++] = x;

     adjust();

}

 

template<class T>

void PQueue<T>::adjust()

{

     T temp = pqelements[count - 1];

     for(int j = count - 2;j >= 0;--j)

         if(pqelements[j] <= temp)   //发现有比temp更小或相等的pqelements[j]则跳出循环

              break;

         else

              pqelements[j+1] = pqelements[j]; //item大的元素pqelements[j]后移

     pqelements[j+1] = temp;

}

 

template<class T>

bool PQueue<T>::RemoveMin(T &x)

{

     if(count == 0)

         return false;

     x = pqelements[0];

     for(int i = 1;i<count;++i)

         pqelements[i-1] = pqelements[i];

     --count;

     return true;

}

 

template<class T>

bool PQueue<T>::GetFront(T &x) const

{

     if(count == 0)

         return false;

     else

     {

         x = pqelements[0];

         return true;

     }

}

 

#endif

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值