堆与优先权队列的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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((childheap[child+1])) 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::PrioQueue(int mSize)

{

maxSize=mSize;

n=0;

q=new T[maxSize];

}

template

void PrioQueue::AdjustUp(int j)

{

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::AdjustDown (int r,int j)//向下调整

{

int child=2*r+1;

T temp=q[r];

while (child<=j)

{

if((childq[child+1])) 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::Output(ostream&out) const//

{

int i=0;

while (i!=n) out<

}

enum ResultCode{Underflow,Overflow};//枚举类型列出可能出现的异常template

void PrioQueue::Append(const T &x)

{

if(IsFull()) throw Overflow;

q[n++]=x;

AdjustUp(n-1);

}

out.h

#include "Heap.h"

相关文档
最新文档