用堆封装优先级队列

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

猜你喜欢

转载自blog.csdn.net/lyjwonderful/article/details/80303206