编写优先队列数据priorityqueue.docx
《编写优先队列数据priorityqueue.docx》由会员分享,可在线阅读,更多相关《编写优先队列数据priorityqueue.docx(11页珍藏版)》请在冰豆网上搜索。
编写优先队列数据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(cheap[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(ciheap[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内完成,大顶堆代码在《数据结构》中稍微调整了一下,整个元素集合封装只可以调用函数访问.
测试数据:
第一组:
第二组: