优先队列ADT的实现

优先队列是一种特殊的队列,基于二叉堆实现,在插入、删除元素上具有较好的算法性能。由于二叉堆的高度为logN,故在插入、删除元素时最多调整logN次,时间复杂度为O(logN)。
给出优先队列ADT的代码,其中priority_judge为优先级判断。一般来说,在插入、删除操作时,优先级较高的应往堆顶调整,优先级低的应该往堆底调整。在调整元素时,为了排除常数的影响,首先将要调整的目标元素备份,然后依次将要调整的元素与该元素比较,具体来说,在插入元素时,我们采用的是上滤的思想,因此在调整过程中,从堆底比较子节点与父节点的优先级,如果子节点的优先级高,则需要将父节点下移,相当于要调整的目标元素上滤;同理,在删除元素时,我们采用的是下沉的思想,从堆顶比较父节点与两个子节点的优先级,如果其中子节点的优先级高于父节点,则需要将子节点上移,相当于要调整的目标元素下沉。最后将元素保存在对应的位置,就完成了一次调整。

template<class T>
class Priority_Queue//优先队列ADT
{
    
    
private:
    T t[maxSize];
    int len;//优先队列的长度
public:
    void Init();//初始化
    T Top();//返回优先级最大的元素
    void Pop();//弹出优先级最大的元素,同时调整堆
    void Push(T x);//插入元素,同时调整堆
    int Size();//返回队列中元素的个数
    bool Empty();//队列是否为空
};
template<class T>
void Priority_Queue::Init()
{
    
    
    len=0;
}
template<class T>
T Priority_Queue::Top()
{
    
    
    return t[1];
}
template<class T>
int Priority_Queue::Size()
{
    
    
    return len;
}
template<class T>
void Priority_Queue::Pop()//利用下沉的思想
{
    
    
    T t1=t[len];
    len--;
    int l,i=1;
    for(i=1;2*i<=len;i=l)
    {
    
    
        l=2*i;//子节点
        if(l<len&&priority_judge)l++;
        if(priority_judge)t[i]=t[l];
        else break;
    }
    t[i]=t1;
}
template<class T>
void Priority_Queue::Push(T x)//利用上滤的思想
{
    
    
    int i;
    len++;
    i=len;
    for(;i>=2;i=i/2)
    {
    
    
        if(priority_judge)t[i]=t[i/2];
        else break;
    }
    t[i]=x;
}
template<class T>
bool Priority_Queue::Empty()
{
    
    
    return len==0?true:false;
}

猜你喜欢

转载自blog.csdn.net/upc122/article/details/106223662