Data Structure Using C++
Heap Data Structure
Priority Queue | Max Heap
Priority Queue Using Heap In C++
const int MAX_SIZE=10;
class maxHeap{
private:
int capacity;
int size;
int arr[MAX_SIZE][2];
int getLeftChildIndex(int parentIndex){
return 2 * parentIndex+1;
}
int getRightChildIndex(int parentIndex){
return 2 * parentIndex+2;
}
int getParentIndex(int childIndex){
return (childIndex-1)/2;
}
bool hasLeftChild(int index){
return getLeftChildIndex(index) < size;
}
bool hasRightChild(int index){
return getRightChildIndex(index) < size;
}
bool hasParent(int index){
return getParentIndex(index) >= 0;
}
int leftChild(int index){
return arr[getLeftChildIndex(index)][0];
}
int rightChild(int index){
return arr[getRightChildIndex(index)][0];
}
int parent(int index){
return arr[getParentIndex(index)][0];
}
void swap(int x, int y){
int p=arr[x][0];
int d=arr[x][1];
arr[x][0]=arr[y][0];
arr[x][1]=arr[y][1];
arr[y][0]=p;
arr[y][1]=d;
}
public:
maxHeap();
void add(int priority,int element);
int peek();
int remove();
int remove(int index);
void heapifyUp();
void heapifyDown(int index);
int isFull(){
return size==capacity-1;
}
int isEmpty(){
return size==0;
}
};
maxHeap::maxHeap(){
capacity=MAX_SIZE;
size=0;
}
int maxHeap::peek(){
if(size>0){
return arr[0][1];
}
}
void maxHeap::add(int priority,int element){
if(size<capacity){
arr[size][0]=priority;
arr[size][1]=element;
size++;
heapifyUp();
}
}
int maxHeap::remove(){
if(size>0){
int element=arr[0][1];
arr[0][0]=arr[size-1][0];
arr[0][1]=arr[size-1][1];
size--;
heapifyDown(0);
return element;
}else{
cout<<"Index not found!"<<endl;
return 0;
}
}
int maxHeap::remove(int index){
if(index<size){
int element=arr[index][1];
arr[index][0]=arr[size-1][0];
arr[index][1]=arr[size-1][1];
size--;
heapifyDown(index);
return element;
}else{
cout<<"Index not found!"<<endl;
return 0;
}
}
void maxHeap::heapifyUp(){
int index=size-1;
while(hasParent(index)&&parent(index)<arr[index][0]){
swap(getParentIndex(index),index);
index=getParentIndex(index);
}
}
void maxHeap::heapifyDown(int index){
while(hasLeftChild(index)){
int greaterChildIndex=getLeftChildIndex(index);
if(hasRightChild(index)&&rightChild(index)>leftChild(index)){
greaterChildIndex=getRightChildIndex(index);
}
if(arr[index][0]>arr[greaterChildIndex][0]){
break;
}else{
swap(index, greaterChildIndex);
}
index=greaterChildIndex;
}
}class PriorityQueue
{
private:
maxHeap *heap;
public:
PriorityQueue()
{
heap = new maxHeap();
};
~PriorityQueue()
{
delete heap;
};
void enqueue(int p,int val)
{
if(!heap->isFull())
{
heap->add(p,val);
}else
{
cout << "insert queue is full." << endl;
}
};
int dequeue()
{
if(!heap->isEmpty())
{
int val=heap->remove();
return val;
}
cout << "remove - queue is empty." << endl;
return NULL;
};
bool isEmpty(){
return heap->isEmpty();
}
bool isFull (){
heap->isFull();
}
int getFront(){
if(!isEmpty()){
int val=heap->peek();
return val;
}
else{
return NULL;
}
}
};
int main(){
PriorityQueue q;
q.dequeue();
q.enqueue(2,1);
q.enqueue(3,3);
q.enqueue(1,4);
cout<<"Front element is:"<<q.getFront()<<endl;
cout<<"Remove:"<<q.dequeue()<<endl;
cout<<"Remove:"<<q.dequeue()<<endl;
cout<<"Remove:"<<q.dequeue()<<endl;
cout<<"Remove:"<<q.dequeue()<<endl;
}
Let me know in the comment section if you have any question.
Previous Post:
Heap Sort In Data Structure Using C++
Comments
Post a Comment