自己封装的优先队列,堆实现
Posted henserlinda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己封装的优先队列,堆实现相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX_H nodes1
#define MIN_H nodes2
#define LL long long
using namespace std;
struct nodes1
{
LL k;
bool operator <(const nodes1 &b) const
{
return k < b.k;
}
};
struct nodes2
{
LL k;
bool operator <(const nodes2 &b) const
{
return k > b.k;
}
};
template <class TYPE>
class Que
{
public:
Que()
{
len = 0;
}
int len;
TYPE num[30005];
void adjust_d(TYPE num[], int cur, int n)
{
int i = cur,j = i*2+1;
//printf("ij: %d %d
", i, j);
//printf("%d
",n);
while(j < n)
{
if(j+1 < n)
j = num[j]<num[j+1]?j+1:j;
if(num[i]<num[j])
{
swap(num[i],num[j]);
//printf("swap: %d %d
", i, j);
i = j;
j = i*2+1;
}
else
break;
}
}
void adjust_a(TYPE num[], int cur)
{
int i = cur,j = (i-1)/2;
//printf("ij: %d %d
", i, j);
//printf("%d
",n);
while(j >= 0)
{
if(num[j]<num[i])
{
swap(num[i],num[j]);
//printf("swap: %d %d
", i, j);
i = j;
j = (i-1)/2;
}
else
break;
}
}
void push(TYPE tmp)
{
num[len++] = tmp;
adjust_a(num,len-1);
}
TYPE top()
{
return num[0];
}
void pop()
{
swap(num[0],num[len-1]);
len--;
adjust_d(num,0,len);
}
bool empty()
{
if(len == 0)
return true;
return false;
}
int size()
{
return len;
}
};
void solve()
{
int n,m;
Que<MAX_H> Q_max; //大顶堆
Que<MIN_H> Q_min; //小顶堆
}
以上是关于自己封装的优先队列,堆实现的主要内容,如果未能解决你的问题,请参考以下文章