优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有
1) 查找;
2) 插入一个新元素;
3) 删除.
在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.
最大优先权队列的抽象数据类型描述如ADT 9-1所示,最小优先队列的抽象数据类型描述与之类似,只需将最大改为最小即可.
ADT 最大优先队列的抽象数据类型描述抽象数据类型
M a x P r i o r i t y Q u e u e
有限的元素集合,每个元素都有一个优先权
操作
Create ( ):创建一个空的优先队列
Size ( ):返回队列中的元素数目
Max ( ):返回具有最大优先权的元素
I n s e rt (x):将x插入队列
DeleteMax (x):从队列中删除具有最大优先权的元素,并将该元素返回至x
}
优先队列插入和删除元素的复杂度都是O(lgn),所以很快。
另一种描述方法是采用有序线性表,当元素按递增次序排列,使用链表时则按递减次序排列,这两种描述方法的删除时间均为( 1 ),插入操作所需时间为(n).
例:
假设我们对机器服务进行收费.每个用户每次使用机器所付费用都是相同的,但每个
用户所需要服务时间都不同.为获得最大利润,假设只要有用户机器就不会空闲,我们可以把
等待使用该机器的用户组织成一个最小优先队列,优先权即为用户所需服务时间.当一个新的
用户需要使用机器时,将他/她的请求加入优先队列.一旦机器可用,则为需要最少服务时间
(即具有最高优先权)的用户提供服务.
如果每个用户所需时间相同,但用户愿意支付的费用不同,则可以用支付费用作为优先权,
一旦机器可用,所交费用最多的用户可最先得到服务,这时就要选择最大优先队列.
打开IDE
我们基于VC++2012创建一个工程
优先队列头文件实现如下
#if !defined(AFX_SQPQUEUE_H__0E52A62B_D94A_4F11_9215_B39D8FE5BD34__INCLUDED_)
#define AFX_SQPQUEUE_H__0E52A62B_D94A_4F11_9215_B39D8FE5BD34__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include<fstream.h>
#define MaxSize 6
typedef struct Datatype
{int taskNo;
int priority;
}datatype;
class SqPqueue
{private:
datatype data[MaxSize];
int count;
public:
//构造函数
SqPqueue(){count=0;}
//析构函数
~SqPqueue(){}
//清空队列
void ClearPq(){count=0;}
// 判断队空
int PQueueEmpty();
// 判断队满
int PQueuefull();
//重载关系运算符小于<
friend int operator <(datatype &,datatype &);
// 队列的插入
void InsertPQ(datatype);
// 队列的删除
datatype DeQueue();
// 取队列的头元素
datatype PQueuefront();
//求队列的元素个数
int PQueueSize();
};
#endif // !defined(AFX_SQPQUEUE_H__0E52A62B_D94A_4F11_9215_B39D8FE5BD34__INCLUDED_)
优先队列类文件实现如下
#include "stdafx.h"
#include "SqPqueue.h"
//顺序优先级队列的实现
#include "SqPQueue.h"
// 判断队空
int SqPqueue::PQueueEmpty() {
return count==0;}
// 判断队满
int SqPqueue::PQueuefull(){
return count==MaxSize;}
//重载关系运算符小于<
int operator <(datatype &b,datatype &c)
{return b.priority<c.priority;}
//队列的插入
void SqPqueue::InsertPQ(datatype x)
{if(PQueuefull())
{cerr<<"队列满.\n";exit(1);}
data[count]=x;
count++;
}
//队列的删除
datatype SqPqueue::DeQueue()
{if(PQueueEmpty())
{cerr<<"队列空.\n";exit(1);}
datatype min=data[0];
int minindex=0;
for(int i=0;i<count;i++)
if(data[i]<min)
{min=data[i];minindex=i;}
data[minindex]=data[count-1];
count--;
return min;
}
// 取队列的头元素
datatype SqPqueue::PQueuefront()
{if(PQueueEmpty())
{cerr<<"队列空.\n";exit(1);}
datatype min=data[0];
for(int i=1;i<count;i++)
if(data[i]<min)
min=data[i];
return min;
}
//求队列的元素个数
int SqPqueue::PQueueSize()
{return count;}
插入下列类的操作代码
#include "stdafx.h"
#include "SqPQueue.h"
void main()
{
cout<<"SqPQueuem.cpp运行结果:\n";
SqPqueue MyQueue;
datatype task;
int i,m;
cout<<"输入产生随机数的种子数m:";cin>>m;
srand(m);
cout<<"生成顺序优先级队列MyQueue:\n";
for(i=0;i<MaxSize;i++)
{task.taskNo=i+1;
task.priority=rand()%10;
MyQueue.InsertPQ(task);}
cout<<"求顺序优先级队列MyQueue的长度:";
cout<<MyQueue.PQueueSize()<<endl;
cout<<"输出顺序优先级队列MyQueue:\n";
cout<<"序号 任务号 优先级\n";
i=1;
while(!MyQueue.PQueueEmpty())
{cout<<setw(2)<<i;
task=MyQueue.DeQueue();
cout<<setw(6)<<task.taskNo;
cout<<setw(7)<<task.priority<<endl;
i++;}
cin.get();
cin.get();
}
代码下载如下
http://download.csdn.net/detail/yincheng01/4785666