#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
class minHeap{
private:
int *heap; //存储数据和key值的数组,为了简单在这人只存储整数key值
int capacity; // 数组的的最大容量
int size; // 目前为止数组中有数据的项的数量
int isLeaf(int pos){
return (pos<size&&pos>=(size/2)-1);
}
int left(int pos){
return pos*2+1;
}
int right(int pos){
return pos*2+2;
}
int parent(int pos){
return (pos-1)/2;
}
public:
//constructor : 通过形参maxSize 用new 给heap指针分配maxSize个内存
minHeap(int maxSize){
heap=new int[maxSize];
capacity=maxSize; // 把容量初始化为maxSize
size=0; // 刚开始包含数据(key值)为零
}
// destructor : 通过delete函数把自己分配的内存先清楚,再交给destructor 处理
~minHeap(){
delete[] heap;}
// clear : clear的目的是清楚内存中的数据而不是清楚内存,所以我们为了方便先删除内存再进行分配
void clear(){
delete [] heap; // 先删除内存
size=0; // 数据数量初始化为零
heap=new int[capacity];// capacity 是容量不动,并通过他再分配内存
}
//deleteFirst : 删除heap的第一个(根)元素 并返回其中内容
int deleteFirst(){
if(size==0) // 如果heap为空 没有删除的项 退出函数并返回一个乱码(-9999999999)
return -999999999;
if(size==1){
//如果heap中只有一个元素(项) 那么size变零,退出函数并返回那个项的值
size--;
return heap[0];
}
int returnElement=heap[0]; //首先把删除项的key值赋给returnElement这个变量
heap[0]=heap[--size]; //用最后一个元素进行覆盖第一个删除项的元素 并size要减少一个
int pos=0; // 因为元素之间交换了数据 破坏了minHeap的基本属性,所以下面对minHeap重新整理 pos为除项的下标
while(!isLeaf( pos)){
//当回复minHeap过程中,只要pos小标的项变成叶子是退出循环(或者不进入循环)
int l=left(pos); int r=right(pos); // l 为pos项的左边孩子 r为pos项的右边孩子
if(l<size&&heap[l]>heap
C++ 实现堆(heap)
最新推荐文章于 2024-03-26 23:29:24 发布