实验七优先队列与堆实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告部分

HUNAN UNIVERSITY 课程实习报告

题目:优先队列与堆

学生姓名廖嘉琦

学生学号 20090820109 专业班级通信一班

指导老师夏艳

完成日期 2010-11-2

一、需求分析

(1)本程序要求利用最小值堆实现一个优先队列。

(2)对于优先队列应该支持如下操作:初始化队列的init操作;获得队列中元素个数的size操作;判定队列是否为空的empty操作;获得队列中最优先的元素的值的top 操作;向队列中插入一个元素的push操作;删除队列中最优先的元素的pop操作。(3)利用优先队列存入所有病人的信息(编号和病情严重程度)。最后利用优先队列获得病人看病的次序。

(4)堆的数组的ID和和Priority由用户通过键盘输入,其取值范围为(0,216)。不对非法输入做处理,即假设输入都是合法的。

(5)在Dos界面输出病人看病的次序。

(6)测试数据

输入

115

2 3

3 5

420

510

-1 -1

输出

2

3

5

1

4

二、概要设计

抽象数据类型

为实现上述程序的功能,应以整数存储用户的输入,以及计算出的结果。

算法的基本思想

(1)根据题目要求,最小值堆采用数组作为物理存储结构,每个元素是一个结构体变量,包含编号ID和病情严重程度Priority值,以Priority进行排序,最后由优先队列获得病人看病的次序。

程序的流程

程序由三个模块组成:

(1)输入模块:完成输入结构体数组中每个元素的ID和Priority节点个数,存储在struct patient p[30]中。

(2)处理模块:再定义一个类,将该数组作为参数传给类,使数组变成一个优先队列。

(3)输出模块:屏幕上显示排序后的病人看病次序。

三、详细设计

物理数据类型

题目要求输入的正整数的取值范围在(0,216)之间,为了能够存储,采用C语言中的整型定义变量。在定义一个结构体变量,存储次序和病情程度。

struct patient {

int ID;

int Priority; };

算法的具体步骤算法流程图如下

输入和输出的格式

输入

615

7 3

8 5

920

1010 //输入病人的ID号和Priority

-1 -1 //以-1结束

输出

2

3

5

1

4 //输出病人的次序

四、调试分析

略。

五、测试结果

输入

1115

12 3

13 5

1420

1510

-1 -1

输出

2

3

5

1

4

六、用户使用说明(可选)

1、本程序的运行环境为DOS操作系统,执行文件为正式实验七.exe

2、运行程序时

提示输入病人的ID号和Priority

以-1结束

七、实验心得(可选)

略。

七、附录(可选)

正式试验七.c 主程序

#include

struct patient

{

int ID;

int Priority;

}; //定义一个结构体变量

class minheap

{

private:

struct patient* Heap;

int size;

int n;

void siftdown(int);

public:

minheap(struct patient * h,int num,int max) //包涵该数组、数组元素数目、数组的大小{

Heap=h;

n=num;

size=max;

buildHeap(); //建立一个最小值堆

}

int heapsize() const { return n;} //堆的大小

bool isLeaf (int pos) const

{ return (pos >=n/2)&&(pos

int leftchild(int pos) const

{ return 2*pos+1; } //得到左节点

int rightchild(int pos) const

{ return 2*pos+2; } //得到右节点

int parent(int pos) const

{ return (pos-1)/2; } //得到父节点

bool empty()

{ if(n==0) return true; else return false;} //判定队列是否为空

bool push(const struct patient&); //向队列中插入一个元素

bool pop(struct patient&); //删除队列中最优先的元素bool top(struct patient&); //获得队列中最优先的元素的值

void buildHeap()

相关文档
最新文档