用最大堆实现优先队列(c++)

来源:互联网 发布:域名能绑定端口吗 编辑:程序博客网 时间:2024/06/05 16:32

关于最大堆,最小堆的概念这里不再介绍。

#include <iostream>#include <vector>using namespace std;template<typename T>class PriorityQueue {    private:        vector<T> v;        int size;        const static int initCap = 100;    private:        int parent(int pos) {            return pos/2;        }        int left(int pos) {            return pos*2;        }        int right(int pos) {            return pos*2 + 1;        }    public:        PriorityQueue():            size(0) {                v = vector<T>(initCap);            }        bool enQueue(const T& t) {            size++;            v[size] = t;            int i = size;            //插入到尾部,一直上提到使当前堆符合最大堆性质为止            while(i > 1 && v[i] > v[parent(i)]) {                T tmp = v[i];                v[i] = v[parent(i)];                v[parent(i)] = tmp;                i = parent(i);            }            return true;        }        bool deQueue(T& max) {            //取出最大值,并把尾部元素和最大值交换,然后维护当前堆到符合堆性质            if(size < 1) {                return false;            }            max = v[1];            v[1] = v[size];            v[size] = max;            size--;            maxHeapIfy(1);            return true;        }        void maxHeapIfy(int pos) {            int largestPos = pos;            if(left(pos) <= size && v[pos] < v[left(pos)]) {                largestPos = left(pos);            }            if(right(pos) <= size && v[largestPos] < v[right(pos)]) {                largestPos = right(pos);            }            if(largestPos != pos) {                T tmp = v[pos];                v[pos] = v[largestPos];                v[largestPos] = tmp;                maxHeapIfy(largestPos);            }        }        int getSize() {            return size;        }        bool top(T& t) {            if(size < 1) {                return false;            }            t = v[1];            return true;        }};int main() {    PriorityQueue<int> pQ;    pQ.enQueue(8);    pQ.enQueue(1);    pQ.enQueue(3);    pQ.enQueue(6);    pQ.enQueue(5);    pQ.enQueue(3);    pQ.enQueue(10);    pQ.enQueue(9);    pQ.enQueue(7);    int a = -1;    while(pQ.deQueue(a)) {        cout<<a<<" ";    }    cout<<endl;    return 0;}
原创粉丝点击