版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wan_shibugong/article/details/80320089
堆的基本操作
优先级队列
优先队列是一种数据结构,能够保证每次出队的是队列中优先级最高的元素(可以自己定义比较器),使用堆的堆顶元素维护这个优先级最高的元素,因为堆具有堆序性,堆顶元素要么是最小的,要么是最大的。
代码实现
使用到的堆
//PriorityQueue.h
#include "Heap.h"
typedef struct PriorityQueue
{
Heap _hp;
}PriorityQueue;
// 优先级队列初始化
void PriorityQueueInit(PriorityQueue* q, Compare com);
// 向队列中插入元素
void PriorityQueuePush(PriorityQueue* q, DataType data);
// 删除优先级最高的元素
void PriorityQueuePop(PriorityQueue* q);
// 获取队列中优先级最高的元素
int PriorityQueueSize(PriorityQueue* q);
// 检测优先级队列是否为空
int PriorityQueueEmpty(PriorityQueue* q);
// 获取堆顶的元素
DataType PriorityQueueTop(PriorityQueue* q);
// 销毁优先级队列
void PriorityQueueDestroy(PriorityQueue* q);
//打印队列数据
void PriorityQueuePrint(PriorityQueue *q);
PriorityQueue.c
#include "PriorityQueue.h"
// 优先级队列初始化
void PriorityQueueInit(PriorityQueue* q, Compare com)
{
assert(q);
HeapInit(&q->_hp,com);
}
// 向队列中插入元素
void PriorityQueuePush(PriorityQueue* q, DataType data)
{
assert(q);
InsertHeap(&q->_hp,data);
}
// 删除优先级最高的元素
void PriorityQueuePop(PriorityQueue* q)
{
assert(q && (q->_hp)._size > 0);
DeleteHeap(&q->_hp);
}
// 获取队列中优先级最高的元素
int PriorityQueueSize(PriorityQueue* q)
{
assert(q);
return q->_hp._array[0];
}
// 检测优先级队列是否为空
int PriorityQueueEmpty(PriorityQueue* q)
{
assert(q);
return EmptyHeap(&q->_hp);
}
// 销毁优先级队列
void PriorityQueueDestroy(PriorityQueue* q)
{
assert(q);
DestroyHeap(&q->_hp);
}
//打印优先级队列数据
void PriorityQueuePrint(PriorityQueue *q)
{
int i = 0;
int n = q->_hp._size;
for(i=0; i < n; ++i)
{
printf("%d ",PriorityQueueSize(q));
PriorityQueuePop(q);
q->_hp._capacity;
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Heap.h"
#include "PriorityQueue.h"
//优先级队列的基本操作
void TestQueue();
int main()
{
TestQueue();
return 0;
}
void TestQueue()
{
PriorityQueue q; //定义一个队列
PriorityQueueInit(&q,Less); //队列初始化
PriorityQueuePush(&q,5); //队列插入元素
PriorityQueuePush(&q,7);
PriorityQueuePush(&q,2);
PriorityQueuePush(&q,1);
PriorityQueuePush(&q,8);
PriorityQueuePush(&q,0);
PriorityQueuePush(&q,3);
PriorityQueuePrint(&q); //打印队列元素
}