堆:
是一个满足每个节点都大于等于其子节点的二叉树。
优先队列:
优先队列底层是堆,下面给出代码
Push是在二叉树的新节点到根节点的路径上寻找合适的插入位置;
Pop是删除根节点之后维护大根堆,顺便为最后一个元素寻找合适的位置;
#include<bits/stdc++.h>
using namespace std;
template<class T>
class p_queue {
private:
int cap = 10000010;//开辟的空间大小
int size;//当前数据数量
T* data;
public:
p_queue() {
data = (T*)malloc((cap + 1) * sizeof(T));
if (!data) {
perror("传入数据不合法");
return;
}
size = 0;
}
~p_queue() {
while (!Empty())Pop();
}
int Size() {
return size;
}
bool Empty() {//判空
return size == 0;
}
bool Full() {//判满
return size == cap;
}
void Push(T key) {
if (Full())return perror("优先队列已满"), void();
if (Empty())return data[++size] = key, void();
int i;
for (i = ++size; i > 1 && data[i / 2] < key; i /= 2) {
data[i] = data[i / 2];
}
data[i] = key;
};//堆插入
void Pop() {
if (Empty()) {
perror("错误:数组为空");
return;
}
int i;
T now = data[size];
--size;
for (i = 1; i * 2 <= size;) {
int che = i * 2;
if (che != size && data[che + 1] > data[che])che++;
if (now < data[che]) { data[i] = data[che], i = che; }
else break;
}
data[i] = now;
};//删除堆顶
T Top() {
if (Empty()) {
perror("错误:数组为空");
return data[0];
}
else return data[1];
};
};
int s[10] = { 2,3,5,1,25,1,3,2,4,10 };
//int s[10] = { 1,1,1,1,1,1,1,1,1,1 };
int main() {
p_queue<int> op;
//op.Pop();
for (int i = 0; i < 10; i++)op.Push(s[i]);
//for (int i = 1; i <= 10; i++)cout << op.data[i] << " ";
while (!op.Empty()) {
cout << op.Top() << " ";
op.Pop();
}
return 0;
}