堆与优先权队列的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、课题名称
堆与优先权队列的设计与实现
二、课题内容和要求
设计要求:理解掌握堆与优先权队列的含义,编程动态实现:
(1)给定一组数据(可以教材为例),构造最小堆;
(2)利用同一组数据为输入序列,实现优先权队列。
三、需求分析
要求构造最小堆,所以需要一个创建堆的CreateHeap(T heap[],int n)函数,用以创建堆,函数中又要调用到向下调整AdjustDown函数,实现最小堆的生成。这两个函数包含在头文件Heap.h中。另外还要求实现优先权队列,需要一个优先权队列类PrioQueue,类中实现优先权队列的构造、调整、插入等功能。该类包含在头文件PrioQueue.h 中。要求要动态实现,故需要有输出函数实现特定形式的动态演示,包含在out.h和Out2.h中。
四、概要设计
建立工程B09040121.dsw,含五个文件,包括main.cpp,Heap.h,Prioqueue.h,out.h,Out2.h。文件Heap.h中包含创建堆的CreateHeap(T heap[],int n)函数和向下调整AdjustDown函数,文件PrioQueue.h包含优先权队列类PrioQueue,类中实现优先权队列的构造、调整、插入等功能。文件out.h和Out2.h各自定义两个输出函数,分别对应堆的输出和优先权队列的输出。
五、详细设计
上面已经介绍工程共含main.cpp,Heap.h,Prioqueue.h,out.h,Out2.h五个文件,下面列出各个文件的程序代码:
Heap.h:
template
void AdjustDown (T heap[],int r,int j)//向下调整
{
int child=2*r+1;
T temp=heap[r];
while (child<=j){
if((child
if(temp<=heap[child]) break;
heap[(child-1)/2]=heap[child];
child=2*child+1;
}
heap[(child-1)/2]=temp;
out(heap);
}
template
void CreateHeap(T heap[],int n)//建堆运算
{
for(int i=(n-2)/2;i>-1;i--) AdjustDown(heap,i,n-1);
}
PrioQueue.h
//#include
template
class PrioQueue
{
public:
PrioQueue(int mSize=20);
~PrioQueue(){delete[] q;};
bool IsEmpty() const{return n==0;}
bool IsFull() const{return n==maxSize;}
void Append(const T &x);
private:
void AdjustDown(int r,int j );
void AdjustUp(int j);
T *q;
int n,maxSize;
void Output(ostream& out) const; //打印队列中全部元素
};
template
PrioQueue
{
maxSize=mSize;
n=0;
q=new T[maxSize];
}
template
void PrioQueue
{
static int p=0;//定义静态变量p,初始化0
p++;
int i=j;
T temp=q[i];
while (i>0&&temp { q[i]=q[(i-1)/2]; i=(i-1)/2; } q[i]=temp; Out2(q,p); 调用Out2(T q[],int p) } template void PrioQueue { int child=2*r+1; T temp=q[r]; while (child<=j) { if((child if(temp<=q[child]) break; q[(child-1)/2]=q[child]; child=2*child+1; } q[(child-1)/2]=temp; out(q);//调用out(T heap[]) } template void PrioQueue { int i=0; while (i!=n) out< } enum ResultCode{Underflow,Overflow};//枚举类型列出可能出现的异常template void PrioQueue { if(IsFull()) throw Overflow; q[n++]=x; AdjustUp(n-1); } out.h #include "Heap.h"