优先队列和堆
优先队列
特殊的“队列”,取出元素的顺序是依照元素的优先权的大小,而不是先进先出。
优先队列会进行自动排序
#include
#include
using namespace std;
int main()
{
priority_queue i;//优先队列声明
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
return 0;
}
堆
堆的基本操作(构建,插入,删除)
#include
#include
using namespace std;
typedef ElementType int;
typedef struct HNode *Heap; /* 堆的类型定义 */
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]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;
}