您的位置:首页 > 其它

基于堆得优先队列

2015-04-30 00:05 190 查看
#include <iostream>

using namespace std;

class priority_queue///简单实现了整数的优先队列(数越小优先值越大)

{

private:

int *ary;

int len;

int MAX;

void adjust_down(int st)///向下调整堆

{

while(st<len)

{

int ans=st;

if(st*2+1<len&&ary[ans]>ary[st*2+1])

ans=st*2+1;

if(st*2+2<len&&ary[ans]>ary[st*2+2])

ans=st*2+2;

if(ans==st)

return;

else

{

swap(ary[st],ary[ans]);

st=ans;

}

}

}

void adjust_on(int st)///向上调整堆

{

while(st>0)

{

int ans=st;

if(ary[st]<ary[(st-1)/2])

ans=(st-1)/2;

if(st==ans)

return;

else

{

swap(ary[st],ary[ans]);

st=ans;

}

}

}

public:

priority_queue()

{

MAX=100;

ary = new int[MAX];

len=0;

}

bool pop()///删除元素

{

if(empty())

return false;

swap(ary[0],ary[len-1]);

--len;

adjust_down(0);

return true;

}

int top()///得到队头元素

{

return ary[0];

}

void push(int x)///插入数据

{

if(len==MAX)

{

int *b = new int[MAX+200];

MAX+=200;

for(int i=0; i<len; i++)

b[i]=ary[i];

delete ary;

ary=b;

}

ary[len]=x;

len++;

adjust_on(len-1);

}

bool empty()///判空

{

if(len==0)

return true;

else

return false;

}

int size()///返回队列的大小

{

return len;

}

~priority_queue() {};

};

int main()

{

int n;

priority_queue pq;

cin>>n;

int tmp;

for(int i=0; i<n; i++)

{

cin>>tmp;

pq.push(tmp);

}

for(int i=0; i<n; i++)

{

cout<<pq.top()<<" ";

pq.pop();

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: