⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maxbheapcpp.h

📁 MaxHeap operation like insert and delete
💻 H
字号:
#ifndef MAXBHEAPCPP_H
#define MAXBHEAPCPP_H

#include <iomanip>
#include <iostream>
#include <math.h>

using namespace std;

template <class DType>
MaxBHeap<DType>::MaxBHeap(unsigned int size){

	maxkeys = size;
	Keys = new DType[maxkeys];
	numkeys = 0;
}

template <class DType>
MaxBHeap<DType>::MaxBHeap(const MaxBHeap<DType>& maxBHeap){
	maxkeys = maxBHeap.maxkeys;
	numkeys = maxBHeap.numkeys;
	Keys = new DType[maxkeys];
	for(unsigned int count =1; count <= maxBHeap; count++){
		Keys[count] = maxBHeap.Keys[count];
	}
}


template <class DType>
MaxBHeap<DType>& MaxBHeap<DType>::operator =(const MaxBHeap& maxBHeap){
	maxkeys = maxBHeap.maxkeys;
	numkeys = maxBHeap.numkeys;
	Keys = new DType[maxkeys];
	for(unsigned int count =1; count <= maxBHeap; count++){
		Keys[count] = maxBHeap.Keys[count];
	}
	return *this;
}

template <class DType>
MaxBHeap<DType>::~MaxBHeap(){

	delete [] Keys;

}


template <class DType>
void MaxBHeap<DType>::Build(DType *obj, unsigned int size){
	
	maxkeys = 100;
	numkeys = size;
	Keys = new DType[maxkeys];
	unsigned int count;
	for(count =1;count <=size; count++){
		Keys[count] = obj[count-1];
	}

	count = numkeys/2;
	
	while (count >= 1){
		percolatedown(count);
		count--;
	}
}

template <class DType>
void MaxBHeap<DType>::Insert(const DType& obj){
	Keys[++numkeys] = obj;
	DType temp;
	
	unsigned int i=numkeys;

	while( (i>1) && (Keys[i] > Keys[i/2])){
		temp = Keys[i];
		Keys[i] = Keys[i/2];
		Keys[i/2] = temp;
		i=i/2;
	}
}
template <class DType>
DType MaxBHeap<DType>::DeleteMax(){
	DType Max;


	if(IsEmpty())
		cout<<"Empty heap!"<<endl;
	
	else{
		Max = Keys[1];

		Keys[1] = Keys[numkeys];
		numkeys--;

		percolatedown(1);

	}
	return Max;
}

template <class DType>
void MaxBHeap<DType>::percolatedown(unsigned int pos){

	unsigned int left=2*pos;
	unsigned int right=2*pos+1;
	unsigned int largest = pos;

	DType temp;


	if ((left <= numkeys) && (Keys[left] > Keys[pos]))
		largest = left;

	if ((right <= numkeys) && (Keys[right] > Keys[largest]))
		largest = right;

	if(largest != pos)
	{
		temp = Keys[largest];
		Keys[largest]=Keys[pos];
		Keys[pos]=temp;
		
		percolatedown(largest);
	}
}

template <class DType>
bool MaxBHeap<DType>::IncKey(unsigned int pos, const DType& obj){
	DType temp;

	if(Keys[pos] > obj){
		cout << "new key is smaller than current keys";
		return false;
	}

	else{

		Keys[pos]=obj;
		unsigned int i = pos;
		while ( (i>1) && (Keys[i] > Keys[i/2])){
			temp = Keys[i];
			Keys[i] = Keys[i/2];
			Keys[i/2] = temp;
			i=i/2;
		}

		return true;
	}
}

template <class DType>
bool MaxBHeap<DType>::DecKey(unsigned int pos, const DType &obj){
	//DType temp;

	if(Keys[pos] < obj){
		cout << "new key is larger than current keys";
		return false;
	}
	else{
		Keys[pos] = obj;

		percolatedown(pos);
		
		return true;

	}

}


template <class DType>
bool MaxBHeap<DType>::IsEmpty(){

	return (numkeys < 1);
	
}

template <class DType>
bool MaxBHeap<DType>::IsFull(){

	
	return (numkeys >= maxkeys);
}

template <class DType>
ostream& operator << (ostream &os, const MaxBHeap<DType>& maxBHeap) {
	
	for(unsigned int i=1; i<=maxBHeap.numkeys;i++){
		cout << setw(5) << maxBHeap.Keys[i];
	}
	cout << endl;
	
	//unsigned int level =0;
	int level=0;
	int count =1;
	//unsigned int count =1;

	while(count <= maxBHeap.numkeys){
		level++;
		count = count * 2;

	}
	unsigned int j=1;

	for(count=1;count<=level;count++){
		for(unsigned int i=0;i<pow(2.0,count-1);i++)
		{
			for(unsigned int l=0;l< 3*pow(2.0,level-count); l++){
				cout <<" ";
			}
			if(j<=maxBHeap.numkeys){
				if(j/2==0){
					cout << setw(2) << maxBHeap.Keys[j];
					j++;
				}
				else{
					if(j%2==0){
						cout << "/"<< setw(2) <<maxBHeap.Keys[j];
						for(unsigned int y=0; y < (3*pow(2.0,level-count))-3;y++)
						cout << " ";
						j++;
					}
					else{
						cout << maxBHeap.Keys[j] << "\\";
						for(unsigned int y=0; y < (3*pow(2.0,level-count))-3;y++)
						cout << " ";
						j++;
					}
				
				}
			}
			
		}

		cout << endl;


	}
	

	return os;
}



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -