优先队列和堆


优先队列

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

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