普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (largest-in,first-out)的行为特征。
STL中使用heap实现优先队列,底层容器使用的是vector。这里我们使用一个简单数组来代替vector。
以下是一个简单的优先队列实现方案:
template <class T>
class priqueue{
public:
priqueue(int m){//构造函数传入队列的总长度
maxsize=m;
x=new T[maxsize+1];//这里为了计数方便,让下标从1开始
//此时,如果一个元素下标为i,则它的
//左子节点在数组中的下标就是2i
//右子节点在数组中的下标是2i+1
n=0;
}
void Add(T t){//这里构建一个小顶堆
x[++n]=t;
int p;
for(int i=n;i>1 && x[p=i/2]>x[i];i=p){
swap(p,i);
}
}
T extractMin(){
T temp=x[1];//取出堆顶权值最大的那个元素
x[1]=x[n--];//序列长度减1,并将最后一个元素放在堆顶
int p;
for(int i=1;(p=2i)<n;i=p){
if(p+1<n && x[p]>x[p+1])
p++;
if(x[p]>=x[i])//移动到位
break;
swap(p,i);
}
return temp;
}
private:
int n;//队列中元素个数
int maxsize;//整个队列的总长度
T *x;//队列指针
void swap(int i,int j){
T temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
以上的优先队列实现中没有写明相应的保障机制和析构函数,只是一个简单实现。有错误之处还望批评指正。