1、优先级队列
优先队列是一种数据结构,能够保证每次出队的是队列中优先级最高的元素(可以自己定义比较器),使用堆的堆顶元素维护这个优先级最高的元素,因为堆具有堆序性,堆顶元素要么是最小的,要么是最大的。
2、具体代码实现
代码中用到的堆
PriorityQueue.h
#pragma once
#include "Heap.h"
typedef struct PriorityQueue
{
Heap _hp;
}PriorityQueue;
//初始化队列
void PriorityQueueInit(PriorityQueue *q, Compare com);
//入队
void QueuePush(PriorityQueue *q, DataType data);
//出队
void QueuePop(PriorityQueue *q);
//查看堆顶元素
DataType QueueTop(PriorityQueue *q);
//查看队长
int QueueSize(PriorityQueue *q);
//判断队列是否为空
int QueueEmpty(PriorityQueue *q);
//测试
void TestQueue();
PriorityQueue.c
#include "PriorityQueue.h"
//初始化队列
void PriorityQueueInit(PriorityQueue *q, Compare com)
{
HeapInit(&q->_hp, com);
}
//入队
void QueuePush(PriorityQueue *q, DataType data)
{
InsertHeap(&q->_hp, data);
}
//出队
void QueuePop(PriorityQueue *q)
{
DeleteHeap(&q->_hp);
}
//查看堆顶元素
DataType QueueTop(PriorityQueue *q)
{
return TopHeap(&q->_hp);
}
//查看队长
int QueueSize(PriorityQueue *q)
{
return SizeHeap(&q->_hp);
}
//判断队列是否为空
int QueueEmpty(PriorityQueue *q)
{
return EmptyHeap(&q->_hp);
}
void TestQueue()
{
PriorityQueue q;
PriorityQueueInit(&q, Greater);
QueuePush(&q, 5);
QueuePush(&q, 9);
QueuePush(&q, 3);
QueuePush(&q, 7);
QueuePush(&q, 8);
QueuePush(&q, 1);
DataType top = QueueTop(&q);
int size = QueueSize(&q);
int ret = QueueEmpty(&q);
QueuePop(&q);
QueuePop(&q);
top = QueueTop(&q);
size = QueueSize(&q);
ret = QueueEmpty(&q);
}