#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <algorithm>
#define SIZE 10000
using namespace std;
typedef struct
{
int *arr;
int len;
}Heap;
void heapInit(Heap &H)//堆的初始化
{
H.arr = (int *)malloc(sizeof(int)*SIZE);
H.len = 0;
H.arr[0] = INT_MAX;
}
void heapAdjust(Heap &H,int start,int end) //堆的调整
{
int temp = H.arr[start];
for(int i = start*2;i<=end;i=i*2)
{
if(i<end&&H.arr[i+1]>H.arr[i])
{
i++;
}
if(temp>H.arr[i])
{
break;
}
H.arr[start] = H.arr[i];
start = i;
}
H.arr[start] = temp;
}
void heapInsert(Heap &H,int data) 插入堆
{
H.arr[++H.len] = data;
int k = H.len;
while(data>H.arr[k/2])
{
H.arr[k] = H.arr[k/2];
k = k/2;
}
H.arr[k] = data;
}
void Swap(int *a,int *b)//交换元素
{
int temp = *a;
*a = *b;
*b = temp;
}
void heapSort(Heap &H)//堆排序
{
for(int i = H.len;i>0;i--)
{
Swap(&H.arr[1],&H.arr[i]);
heapAdjust(H,1,i-1);
}
}
int heapDel(Heap &H)//删除堆顶取得最值
{
if(H.len>=1)
{
int temp = H.arr[1];
H.arr[1] = H.arr[H.len--];
heapAdjust(H,1,H.len);
return temp;
}
else
{
return -1;
}
}
int main()
{
string cmd;
Heap H;
heapInit(H);
while(cin>>cmd)
{
if(cmd=="push")
{
int temp;
cin>>temp;
heapInsert(H,temp);
}
else if(cmd=="pop")
{
int temp = heapDel(H);
cout<<"堆顶的最大元素为:"<<temp<<endl;
}
for(int i = 1;i<=H.len;i++)
{
cout<<H.arr[i]<<" ";
}
cout<<endl;
}
return 0;
}
堆的基本操作
最新推荐文章于 2020-08-03 15:56:53 发布