#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