1、编写优先队列数据priorityqueue#includeiostream#include stdlib.htypedef int T;#define ERROR 0#define OK 1#define MAX 50typedef struct T *array; int length; int MaxSize;Array;/定义一个数组,用来存放第一次录入的数据。对应有两个函数操作using namespace std;template/定义一种格式,当T改变时,class类型改变,采用class才完成,用最大堆来存取class MaxHeap public : MaxHeap(int M
2、axSize);int Size() return CurrentSize;/求当前堆的元素大小T Max() if (CurrentSize = 0) throw OutOfBounds();return heap1;/求最大的元素void LoadHeap()/遍历整个堆元素 cout输出数据为endl; for(int i=1;i=CurrentSize;i+) coutheapiendl; MaxHeap& Insert( T x);/插入MaxHeap& DeleteMax(T& x);/删除void Initialize(T a, int size);/初始化void heapAd
3、just();/调整private:int CurrentSize, MaxSize;/当前长度和最大长度T *heap; / 元素数组,用堆来存取 ;templateMaxHeap:MaxHeap(int MaxHeapSize)/ 构造函数MaxSize = MaxHeapSize;heap = new TMaxSize+1;CurrentSize = 0;templatevoid MaxHeap:Initialize(T a, int size)/初始化/ 把最大堆初始化为数组a .heap = a;CurrentSize = size;void MaxHeap:heapAdjust()
4、/调整 for (int i = CurrentSize/2; i = 1; i-) T y = heapi; / 子树的根/ 寻找放置y的位置int c = 2*i; / c的父节点是y的目标位置while (c = CurrentSize) / heapc 应是较大的同胞节点if (c CurrentSize &heapc = heapc) break; / 能/ 不能heapc/2 = heapc; / 将孩子上移c *= 2; / 下移一层heapc/2 = y;templateMaxHeap& MaxHeap:Insert(T x)/插入/ 把x 插入到最大堆中if (Current
5、Size = MaxSize)throw NoMem(); / 没有足够空间/为x寻找应插入位置/ i 从新的叶节点开始,并沿着树上升int i = +CurrentSize;while (i != 1 & x heapi/2) / 不能够把x 放入h e a p i heapi = heapi/2; / 将元素下移i /= 2; / 移向父节点heapi = x;return *this;templateMaxHeap& MaxHeap:DeleteMax(T& x)/删除/ 将最大元素放入x ,并从堆中删除最大元素/ 检查堆是否为空if (CurrentSize = 0)throw Out
6、OfBounds(); / 队列空x = heap1; / 最大元素/ 重构堆T y = heapCurrentSize-; / 最后一个元素/ 从根开始,为y 寻找合适的位置int i = 1, / 堆的当前节点ci = 2; / i的孩子while (ci = CurrentSize) / heapci 应是i的较大的孩子if (ci CurrentSize &heapci = heapci) break; / 能/ 不能heapi = heapci; /i = ci; /下移一层ci *= 2;heapi = y;return *this;void InitArray(Array &A)
7、/初始化元素数组 A.array=(T *)malloc(MAX*sizeof(T); A.length=0; A.MaxSize=MAX;void GetArrayKey(Array &A)/输入元素数组的值 cout请输入您数组集合的大小个数n; int key; cout请输入数据endl; for(int i=1;ikey; if(A.length=A.MaxSize) A.array=(T*)realloc(A.array,(A.length+MAX)*sizeof(T); A.array+A.length=key; class OutOfBounds /异常抛出,太麻烦不写publ
8、ic: OutOfBounds() OutOfBounds() ;class NoMem public: NoMem() virtual NoMem() ;/异常抛出,太麻烦不写int main() MaxHeap H(MAX); T x; Array A; InitArray(A); H.LoadHeap(); int choose;/控制选择 while(choose)/菜单选择 cout1.初始化输入数据endl; cout2.插入数据endl; cout3.查找数据endl; cout4.删除数据endl; cout5.遍历数据endl; cout0.退出choose; switch(
9、choose) case 1: GetArrayKey(A);/初始化数据 H.Initialize(A.array,A.length); H.heapAdjust(); break; case 2: /插入元素 cout请输入您想要插入的元素的值x; H.Insert(x); cout插入成功endl;break; case 3:x=H.Max();/求最大元素 cout当前查找最大的元素为:xendl; break; case 4: H.DeleteMax(x);/删除最大元素 cout删除的最大元素为: xendl; break; case 5: H.LoadHeap();break;/
10、遍历整个数组元素 case 0:return 0; return 0;数据结构选择:定义T为INT类型,权值为INT类型,定义一个class,里面一个private T *heap,采用大顶堆的方法实现函数功能,函数实现都是在class里面的public 函数;算法实现: 在class里面实现全部函数,函数定义为public一个初始化initialize(T a, int size),把一个数组直接覆盖掉原来的T *heap,并执行相应的长度变化操作.一个插入Insert( T x):在数组的最尾部插入,插入之后进行大顶堆调整,保证第一个数组元素为最大权值一个删除DeleteMax(T& x):返回第一个数组元素,然后进行大顶堆调整,重新建堆 一个查找最大元素T Max():返回第一个数组元素一个遍历void LoadHeap():采用从头到尾遍历整个数组元素一个求元素数组的长度int Size():返回当前长度总结:由于编写优先队列数据(priority_queue)类型可以用很多种方法实现,而且难度不大,所以在数据结构和C语音的基础上自学了C+,代码才用C+语言描写,函数在class内完成,大顶堆代码在数据结构中稍微调整了一下,整个元素集合封装只可以调用函数访问.测试数据:第一组: 第二组:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1