优先级队列(使用堆进行封装)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);     //打印队列元素

}

猜你喜欢

转载自blog.csdn.net/Wan_shibugong/article/details/80320089
今日推荐