优先队列和堆
优先队列
特殊的“队列”,取出元素的顺序是依照元素的优先权的大小,而不是先进先出。
优先队列会进行自动排序
#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;
}

浙公网安备 33010602011771号