zoukankan      html  css  js  c++  java
  • C++优先级队列表基本算法实现

    C++优先级队列表基本算法实现

    主要采用链式结构,进行数据存储,然后定义一个最后结点指针数组,将所有优先级最后一个元素的地址保存到这个指针数组中。

    #ifndef PriorityQueue_h
    #define PriorityQueue_h
    #include <iostream>
    template <class T>
    struct PriorityNode{
        short priority;                 //优先级
        T data;                         //数据域
        struct PriorityNode<T> * next; //指针域
    };
    #define PRIORITY_NUMBER 10
    template < class T>
    class PriorityQueue{
    public:
        PriorityQueue();
        ~PriorityQueue();
        void Push(T x, short pri);
        T Pop();
        bool Empty();
        void PushAdjustLastNodeArray(short pri, PriorityNode<T> *p);//入队时调整数组
        void PopAdjustLastNodeArray(PriorityNode<T> *p);//出队时调整数组
    private:
        PriorityNode <T> * front;                          //头结点
        PriorityNode <T> * lastNodeArray[PRIORITY_NUMBER]; //最后结点指针数组
    };
    template <class T>
    PriorityQueue<T>::PriorityQueue(){
        front = new PriorityNode <T>;
        front->next = NULL;
        for(int i = 0; i< PRIORITY_NUMBER;i++){
            lastNodeArray[i] = front;
        }
    }
    template <class T>
    PriorityQueue<T>::~PriorityQueue(){   //析构函数
        PriorityNode <T> * p = front;
        while(p){
            p = p->next;
            delete front;
            front = p;
        }
    }
    template <class T>
    bool PriorityQueue<T>::Empty(){
        if(!front->next)
            return true;
        else
            return false;
    }
    template <class T>
    void PriorityQueue<T>::Push(T x, short pri){
        if(pri>=PRIORITY_NUMBER) throw "Priority too great!";
        PriorityNode<T> *s = new PriorityNode<T>;
        s->data = x;
        s->priority = pri;
        //新结点加入到链中
        s->next = lastNodeArray[pri] -> next;
        lastNodeArray[pri]->next = s;
        PushAdjustLastNodeArray(pri,s);
    }
    template <class T>
    T PriorityQueue<T>::Pop(){
        if(!front->next) throw "Queue is NULL";
        PriorityNode<T>*p = front->next;        //保存队头结点
        front->next = p->next;
        T x = p->data;
        PopAdjustLastNodeArray(p);
        delete p;
        return x;
    }
    template <class T>
    void PriorityQueue<T>::PushAdjustLastNodeArray(short pri,PriorityNode<T> *p){
        short i= pri-1;
        while (i>=0 && lastNodeArray[i] == lastNodeArray[pri]){
            lastNodeArray[i] = p;
            i--;
        }
        lastNodeArray[pri] = p;
    }
    template <class T>
    void PriorityQueue<T>::PopAdjustLastNodeArray(PriorityNode<T> *p){
        short pri = p->priority;
        if(lastNodeArray[pri] == p){  //只有当出队元素为该优先级最后一个元素时,才需要调整
            PriorityNode<T> * newLastNode = (pri==PRIORITY_NUMBER-1)?front:lastNodeArray[pri+1];
            short i = pri - 1;
            while(i>=0 && lastNodeArray[i] == lastNodeArray[pri]){
                lastNodeArray[i] = newLastNode;
            }
            lastNodeArray[pri] = newLastNode;
        }
        
    }
    #endif /* PriorityQueue_h */
  • 相关阅读:
    cstc2018 混合果汁
    CF1086E Beautiful Matrix
    AT2000 Leftmost Ball
    CF1208E Let Them Slide
    CF1208D Restore Permutation
    【置顶】博客公告
    [NOI2015]软件包管理器
    【noip2018】积木大赛
    几天连测总结
    【ZJOI2007】棋盘制作
  • 原文地址:https://www.cnblogs.com/ycbeginner/p/10013190.html
Copyright © 2011-2022 走看看