实验10-1

#include <iostream>
using namespace std;
template <class T>
class minPQ
{
public:
 minPQ();
 ~minPQ();
 bool empty();
 int getsize();
 T top();
 void pop();
 void push1(const T &);
private:
 T* heap;        //数组
 int Hsize;              //数组的容量
 int heapsize;           //元素个数
};
//构造
template <class T>
minPQ<T>::minPQ()
{
 heap = new T[100];
 Hsize = 100;
 heapsize = 0;
}
//析构
template <class T>
minPQ<T>::~minPQ()
{
 delete[] heap;
}
//是否为空
template <class T>
bool minPQ<T>::empty()
{
 return heapsize == 0;
}
//顶部元素
template <class T>
T minPQ<T>::top()
{
 if (heapsize == 0)
 {
  return 0;
 }
 else
  return heap[1];
}
//数组加倍
template <class T>
void changelength(T*& a, int oldl, int newl)
{
 if (newl < 0)
 {
  return;
 }
  T* temp = new T[newl];
  if (oldl >= newl)
   return;
  int num = newl;
  copy(a, a + num, temp);
  delete[] a;
  a = temp;
}
//删除头
template <class T>
void minPQ<T>::pop()
{
 if (heapsize == 0)
 {
  return;
 }
 else
 {
  heap[1] = heap[heapsize];
 // cout << "把堆尾给堆顶" << endl;
 }
 heapsize = heapsize - 1;
 //cout << "堆的大小缩小到" << heapsize << endl;
 T lastE = heap[heapsize+1];
 //cout << "把堆尾" << heap[heapsize+1] << "给lastE" << endl;
 int currentNode = 1;
 int child = 2;
 while (child <= heapsize)
 {
  if (child < heapsize && heap[child] > heap[child + 1])
  {
   child++;
  // cout << "塞到右子树" << endl;
  }
  if (lastE <= heap[child])
  {
  // cout << "都满足则退出了" << endl;
   break;
  }
  heap[currentNode] = heap[child];
  heap[child] = lastE;
  //cout << "交换了" << currentNode << "和" << child << endl;
  currentNode = child;
  child *= 2;
 }
}
//插入
template <class T>
void minPQ<T>::push1(const T & theE)
{
 if (heapsize == Hsize-1)
 {
  changelength(heap, Hsize, 2 * Hsize);
  Hsize *= 2;
 }
 //
 heapsize = heapsize + 1;
 heap[heapsize] = theE;
 //cout << "把元素" << theE << "插入到 " << heapsize << " 中" << endl;
 int currentNode = heapsize;
 while (currentNode != 1 && heap[currentNode / 2] > theE)
 {
 // cout << "满足循环条件" << endl;
  heap[currentNode] = heap[currentNode/2];
  heap[currentNode / 2] = theE;
 // cout << "交换" << currentNode << "和" << currentNode / 2 << endl;
  currentNode = currentNode / 2;
 }
}
int main()
{
 int n;
 cin >> n;
 long long *a = new long long[n];
 for (int i = 0; i < n; i++)
 {
  cin >> a[i];
 }
 //初始化
 minPQ<long long> m;
 for (int i = 0; i < n; i++)
 {
  m.push1(a[i]);
 }
 cout << m.top() << endl;
 cin >> n;      //操作数
 int cho;      //操作
 for (int i = 0; i < n; i++)
 {
  cin >> cho;
  switch (cho) {
  case 1: {
   long long num;
   cin >> num;
   m.push1(num);
   cout << m.top() << endl;
   break;
  }
  case 2: {
   m.pop();
   cout << m.top() << endl;
   break;
  }
  case 3: {
   int nn;
   cin >> nn;
   long long aa;
   minPQ<long long> mm;
   for (int i = 0; i < nn; i++)
   {
    cin >> aa;
    mm.push1(aa);
   }
   for (int i = 0; i < nn; i++)
   {
    cout << mm.top() << " ";
    mm.pop();
   }
  }
  }
 }
}
 

创建 最小堆类。最小堆的存储结构使用 数组。提供操作:插入、删除、初始化。题目第一个操作是建堆操作,接下来是对堆的插入和删除操作,插入和删除都在建好的堆上操作。

格式

输入

第一行一个数n(n<=5000),代表堆的大小。第二行n个数,代表堆的各个元素。

第三行一个数m (m<=1000),代表接下来共m个操作。接下来m行,分别代表各个操作。下面是各个操作的格式:

插入操作:1 num
删除操作:2
排序操作:第一行两个数3和n,3代表是排序操作,n代表待排序的数的数目,接下来一行n个数是待排序数

保证排序操作只出现一次且一定是最后一个操作。

输出

第一行建堆操作输出建好堆后堆顶的元素。

接下来m个操作,若是插入和删除操作,每行输出执行操作后堆顶的元素的值;若是排序操作,输出一行按升序排序好的结果,每个元素间用空格分隔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值