优先队列和堆

优先队列

特殊的“队列”,取出元素的顺序是依照元素的优先权的大小,而不是先进先出。
优先队列会进行自动排序

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	priority_queue <int> q;//优先队列声明
	q.size();//返回q里元素个数
	q.empty();//返回q是否为空,空则返回1,否则返回0
	q.push(k);//在q的末尾插入k
	q.pop();//删掉q的第一个元素
	q.top();//返回q的第一个元素
	return 0;
}

堆的基本操作(构建,插入,删除)

#include <iostream>
#include <queue>
using namespace std;
typedef int ElementType;
typedef struct HNode *Heap; /* 堆的类型定义 */
#define ERROR 0

struct HNode {
	ElementType *Data; /* 存储元素的数组 */
	int Size;          /* 堆中当前元素个数 */
	int maxsize;      /* 堆的最大容量 */
};
typedef Heap MaxHeap;
typedef Heap MinHeap;

MaxHeap CreateHeap(int Maxsize) { //建立最大Maxsize大小的最大堆
	MaxHeap H = new HNode;
	H->Data = new int [Maxsize + 1];
	H->Size = 0;
	H->Size = Maxsize;
	H->Data[0] = MAXDATA; //定义最大值“哨兵”
	return H;
}

bool IsFull(MaxHeap H) { //判断满
	return (H->Size == H->maxsize);
}

bool IsEmpty(MaxHeap H) { //判断空
	return (H->Size == 0);
}

//插入
bool Insert( MaxHeap H, ElementType X ) {
	/* 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 */
	int i;
	if ( IsFull(H) ) {
		printf("最大堆已满");
		return false;
	}
	i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
	for ( ; H->Data[i / 2] < X; i /= 2 )
		H->Data[i] = H->Data[i / 2]; /* 上滤X */
	H->Data[i] = X; /* 将X插入 */
	return true;
}

//删除
ElementType DeleteMax( MaxHeap H ) {
	/* 从最大堆H中取出键值为最大的元素,并删除一个结点 */
	int Parent, Child;
	ElementType MaxItem, X;

	if ( IsEmpty(H) ) {
		printf("最大堆已为空");
		return ERROR;
	}

	MaxItem = H->Data[1]; /* 取出根结点存放的最大值 */
	/* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */
	X = H->Data[H->Size--]; /* 注意当前堆的规模要减小 */
	for ( Parent = 1; Parent * 2 <= H->Size; Parent = Child ) {
		Child = Parent * 2;
		if ( (Child != H->Size) && (H->Data[Child] < H->Data[Child + 1]) )
			Child++;  /* Child指向左右子结点的较大者 */
		if ( X >= H->Data[Child] )
			break; /* 找到了合适位置 */
		else  /* 下滤X */
			H->Data[Parent] = H->Data[Child];
	}
	H->Data[Parent] = X;

	return MaxItem;
}

posted @ 2022-02-15 23:26  帝宝单推人!  阅读(33)  评论(0)    收藏  举报