编写优先队列数据priorityqueue.docx

上传人:b****4 文档编号:12072021 上传时间:2023-04-16 格式:DOCX 页数:11 大小:80.99KB
下载 相关 举报
编写优先队列数据priorityqueue.docx_第1页
第1页 / 共11页
编写优先队列数据priorityqueue.docx_第2页
第2页 / 共11页
编写优先队列数据priorityqueue.docx_第3页
第3页 / 共11页
编写优先队列数据priorityqueue.docx_第4页
第4页 / 共11页
编写优先队列数据priorityqueue.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

编写优先队列数据priorityqueue.docx

《编写优先队列数据priorityqueue.docx》由会员分享,可在线阅读,更多相关《编写优先队列数据priorityqueue.docx(11页珍藏版)》请在冰豆网上搜索。

编写优先队列数据priorityqueue.docx

编写优先队列数据priorityqueue

#include"iostream"

#include"stdlib.h"

typedefintT;

#defineERROR0

#defineOK1

#defineMAX50

typedefstruct

{

T*array;

intlength;

intMaxSize;

}Array;//定义一个数组,用来存放第一次录入的数据。

对应有两个函数操作

usingnamespacestd;

 

template//定义一种格式,当T改变时,class类型改变,采用class才完成,用最大堆来存取

classMaxHeap{

public:

MaxHeap(intMaxSize);

 

intSize(){returnCurrentSize;}//求当前堆的元素大小

TMax(){if(CurrentSize==0)throwOutOfBounds();

returnheap[1];}//求最大的元素

voidLoadHeap()//遍历整个堆元素

{

cout<<"输出数据为"<

for(inti=1;i<=CurrentSize;i++)

{

cout<

}

}

MaxHeap&Insert(Tx);//插入

MaxHeap&DeleteMax(T&x);//删除

voidInitialize(Ta[],intsize);//初始化

voidheapAdjust();//调整

private:

intCurrentSize,MaxSize;//当前长度和最大长度

T*heap;//元素数组,用堆来存取

};

 

template

MaxHeap:

:

MaxHeap(intMaxHeapSize)

{//构造函数

MaxSize=MaxHeapSize;

heap=newT[MaxSize+1];

CurrentSize=0;

}

template

voidMaxHeap:

:

Initialize(Ta[],intsize)//初始化

{//把最大堆初始化为数组a.

heap=a;

CurrentSize=size;

}

voidMaxHeap:

:

heapAdjust()//调整

{

for(inti=CurrentSize/2;i>=1;i--){

Ty=heap[i];//子树的根

//寻找放置y的位置

intc=2*i;//c的父节点是y的目标位置

while(c<=CurrentSize){

//heap[c]应是较大的同胞节点

if(c

heap[c]

//能把y放入heap[c/2]吗?

if(y>=heap[c])break;//能

//不能

heap[c/2]=heap[c];//将孩子上移

c*=2;//下移一层

}

heap[c/2]=y;

}

 

}

 

template

MaxHeap&MaxHeap:

:

Insert(Tx)//插入

{//把x插入到最大堆中

if(CurrentSize==MaxSize)

throwNoMem();//没有足够空间

//为x寻找应插入位置

//i从新的叶节点开始,并沿着树上升

inti=++CurrentSize;

while(i!

=1&&x>heap[i/2])

{

//不能够把x放入heap[i]

heap[i]=heap[i/2];//将元素下移

i/=2;//移向父节点

}

heap[i]=x;

return*this;

}

template

MaxHeap&MaxHeap:

:

DeleteMax(T&x)//删除

{//将最大元素放入x,并从堆中删除最大元素

//检查堆是否为空

if(CurrentSize==0)

throwOutOfBounds();

//队列空

x=heap[1];//最大元素

//重构堆

Ty=heap[CurrentSize--];//最后一个元素

//从根开始,为y寻找合适的位置

inti=1,//堆的当前节点

ci=2;//i的孩子

while(ci<=CurrentSize){

//heap[ci]应是i的较大的孩子

if(ci

heap[ci]

//能把y放入heap[i]吗?

if(y>=heap[ci])break;//能

//不能

heap[i]=heap[ci];//

i=ci;//下移一层

ci*=2;

}

heap[i]=y;

return*this;

}

 

voidInitArray(Array&A)//初始化元素数组

{

A.array=(T*)malloc(MAX*sizeof(T));

A.length=0;

A.MaxSize=MAX;

}

voidGetArrayKey(Array&A)//输入元素数组的值

{

cout<<"请输入您数组集合的大小个数"<

intn;

cin>>n;

intkey;

cout<<"请输入数据"<

for(inti=1;i<=n;i++)

{

cin>>key;

if(A.length>=A.MaxSize)

A.array=(T*)realloc(A.array,(A.length+MAX)*sizeof(T));

A.array[++A.length]=key;

}

}

classOutOfBounds//异常抛出,太麻烦不写

{

public:

OutOfBounds()

{}

~OutOfBounds()

{}

};

classNoMem

{

public:

NoMem()

{}

virtual~NoMem()

{}

};//异常抛出,太麻烦不写

 

intmain()

{

MaxHeapH(MAX);

Tx;

ArrayA;

InitArray(A);

H.LoadHeap();

intchoose;//控制选择

while(choose)//菜单选择

{

cout<<"1.初始化输入数据"<

cout<<"2.插入数据"<

cout<<"3.查找数据"<

cout<<"4.删除数据"<

cout<<"5.遍历数据"<

cout<<"0.退出"<

cin>>choose;

switch(choose)

{

case1:

GetArrayKey(A);//初始化数据

H.Initialize(A.array,A.length);

H.heapAdjust();

break;

case2:

//插入元素

cout<<"请输入您想要插入的元素的值"<

cin>>x;

H.Insert(x);

cout<<"插入成功"<

case3:

x=H.Max();//求最大元素

cout<<"当前查找最大的元素为:

"<

break;

case4:

H.DeleteMax(x);//删除最大元素

cout<<"删除的最大元素为:

"<

break;

case5:

H.LoadHeap();break;//遍历整个数组元素

case0:

return0;

}

}

return0;

}

数据结构选择:

定义T为INT类型,权值为INT类型,定义一个class,里面一个privateT*heap,

采用大顶堆的方法实现函数功能,函数实现都是在class里面的public函数;

算法实现:

在class里面实现全部函数,函数定义为public

一个初始化initialize(Ta[],intsize),把一个数组直接覆盖掉原来的T*heap,并执行相应的长度变化操作.

一个插入Insert(Tx):

在数组的最尾部插入,插入之后进行大顶堆调整,保证第一个数组元素为最大权值

一个删除DeleteMax(T&x):

返回第一个数组元素,然后进行大顶堆调整,重新建堆

一个查找最大元素TMax():

返回第一个数组元素

一个遍历voidLoadHeap():

采用从头到尾遍历整个数组元素

一个求元素数组的长度intSize():

返回当前长度

总结:

由于编写优先队列数据(priority_queue)类型可以用很多种方法实现,而且难度不大,所以在《数据结构》和C语音的基础上自学了C++,代码才用C++语言描写,函数在class内完成,大顶堆代码在《数据结构》中稍微调整了一下,整个元素集合封装只可以调用函数访问.

 

测试数据:

第一组:

第二组:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1