用堆封裝優先級隊列

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);
}
發佈了82 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章