c++ 手写优先队列(大根堆)

堆:

是一个满足每个节点都大于等于其子节点的二叉树。

优先队列:

优先队列底层是堆,下面给出代码

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值