队列可以分为FIFO队列和优先队列,优先队列也可以分为最大优先队列和最小优先队列。优先队列可以使用堆来实现,在一个堆结构中,优先队列的查找,插入,删除操作,都可以在O(lgn)的时间内完成。优先队列的常见使用是操作系统的作业调度,每当发生中断时,操作系统会从优先队列中选取一个优先级别最高的作业执行。下面是用最小堆实现的最小优先队列:
# include <iostream>
using namespace std;
# include <stdlib.h>
# define MIN -1
# define MAXSIZE 100
typedef struct priority_queue{
int *arr;
int size;
int capicity;
}pq;
int main()
{ int isempty(pq *T);
int isfull(pq *T);
pq* init(pq *T);
pq* insert(pq *T,int x);
int delmin(pq *T);
int top(pq *T);
pq *T=0;
T=init(T);
for(int i=0;i<10;i++)
T=insert(T,i+1);
cout<<delmin(T)<<endl;
cout<<isfull(T)<<endl;
cout<<isempty(T)<<endl;
system("pause");
return 0;
}
pq* init(pq *T) //优先队列初始化
{
T=(pq *)malloc(sizeof(pq));
T->size=0;
T->capicity=MAXSIZE;
T->arr=(int *)malloc((MAXSIZE+1)*sizeof(pq));
T->arr[0]=MIN;
return T;
}
int isfull(pq *T) //判断队列是否已满
{
return T->size >=MAXSIZE;
}
pq* insert(pq *T,int x) //插入元素
{
if(isfull(T))
return NULL;
int i;
for(i=++T->size;T->arr[i/2]>x;i/=2)
T->arr[i]=T->arr[i/2];
T->arr[i]=x;
return T;
}
int isempty(pq *T) //判断队列是否为空
{
return T->size==0;
}
int delmin(pq *T) //删除最小元素
{
if(isempty(T))
return -1;
int min=T->arr[1];
int last=T->arr[T->size--];
int i,child;
for(i=1;2*i<=T->size;i=child)
{
child=2*i;
if(child!=T->size&&T->arr[child+1]<T->arr[child])
child++;
if(T->arr[child]<last)
T->arr[i]=T->arr[child];
else
break;
}
T->arr[i]=last;
return min;
}
int top(pq *T) //返回堆顶元素
{
return T->arr[T->size];
}
在C++中,可以使用容器适配器priority_queue实现优先队列。
priority_queue可以支持的操作有:
q.empty() 队列为空返回值为真 ,
q.size() 返回队列元素个数,
q.pop() 删除最高优先级别的元素,
q.top()返回优先级别最高的元素,
q.push()以优先级插入元素
优先队列可以存放数组中的元素:
# include <iostream>
using namespace std;
# include <stdlib.h>
# include <functional>
# include <queue>
# include <vector>
int main()
{
priority_queue<int,vector <int>,less<int> > q; //把less<int> 换成 greater<int> 就可以建立最小优先队列
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i=0;
for(i=0;i<10;i++)
q.push(a[i]);
while(!q.empty())
{
cout<<q.top()<<endl;
q.pop();
}
system("pause");
return 0;
}优先队列可以存放类类型的对象:
# include <iostream>
using namespace std;
# include <stdlib.h>
# include <functional>
# include <queue>
# include <vector>
class cmp{
int i;
public:
cmp(int x):i(x){}
friend bool operator <(const cmp &a,const cmp &b) //建立最小优先队列
{
return a.i>b.i;
}
friend ostream& operator <<(ostream & os,const cmp t)
{
return os<<t.i<<endl;
}
int geti()
{
return i;
}
};
int main()
{
priority_queue <cmp> q;
int i=0;
for(i=0;i<10;i++)
q.push(cmp(i));
while(!q.empty())
{
cout<<q.top()<<endl;
q.pop();
}
system("pause");
return 0;
}原文:http://blog.csdn.net/u011608357/article/details/22594201