用二叉堆实现优先队列

来源:互联网 发布:淘宝优秀的试用报告 编辑:程序博客网 时间:2024/05/16 07:34
#include <cstdio>#include <iostream>#define MAXN 100010using namespace std;class priority_queue{    int sizet,heap[MAXN];public:    void clear(){        sizet=0;    }    void push(int x){        int i=sizet++;        while(i>0){            int p=(i-1)/2;            if(heap[p]<x)            {                heap[i]=heap[p];                i=p;            }            else break;        }        heap[i]=x;    }    int top(){        return heap[0];    }    void pop(){        int i=0;        heap[i]=heap[--sizet];        int child=i*2+1;        while(child<sizet){            if(child+1<sizet){                if(heap[child]>heap[child+1]&&heap[child]>heap[i])                {                    swap(heap[child],heap[i]);                    i=child;                }                else if(heap[child+1]>heap[child]&&heap[child+1]>heap[i]){                    swap(heap[child+1],heap[i]);                    i=child+1;                }                else break;            }            else{                if(heap[child]>heap[i]){                    swap(heap[child],heap[i]);                    i=child;                }                else break;            }            child=i*2+1;        }    }    bool empty(){        if(sizet==0) return true;        else return false;    }};int n,v;char op[3];priority_queue pq;int main(){    while(scanf("%d",&n)!=EOF){        pq.clear();        for(int i=1;i<=n;i++){            scanf("%s",op);            if(op[0]=='A'){                scanf("%d",&v);                pq.push(v);            }            else {                printf("%d\n",pq.top());                pq.pop();            }        }    }    return 0;}

0 0
原创粉丝点击