普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (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; } }
以上的优先队列实现中没有写明相应的保障机制和析构函数,只是一个简单实现。有错误之处还望批评指正。
时间: 2024-10-11 08:59:26