为了账号安全,请及时绑定邮箱和手机立即绑定

【数据结构和算法:简单方法】谈一谈优先队列的实现

标签:
算法

首先回忆一下队列(详细内容移步至队列详解),只要记住八个字即可:先进先出(FIFO),后进后出(LILO)。

就像去医院门诊看病排队时一样:先来的先看,看完先走。

而优先队列的特性正是“优先”二字,“优先”二字意味着打破了“常规”“规则”。

优先队列不再遵守普通队列的先进先出的原则了,如何不遵守呢?

最大优先队列:不管入队顺序如何,谁的值最大谁先出队
最小优先队列:不管入队顺序如何,谁的值最小谁先出队
比如,对于最大优先队列,入队顺序为:14352,出队顺序则为:54321;对于最小优先队列,入队顺序为:14352,出队顺序则为:12345.

举个例子:医院的急诊病例,即便来的晚,也是可以优先看病的,因为生命至上。遇到灾难危险时,群众中会先疏散小孩子。

如果在诸如此类需要讲“优先”的情况下,再去讲什么“先进先出”的排队规则,那就不太好了。

那么该如何实现优先队列呢?

首先,在优先队列中,想要出队元素,肯定要先找到最大值,或者最小值;

其次,优先队列“不讲常规”,所以进队顺序已经不重要了,重要的是找到当前队列中的最大值或最小值。

那么,有没有一个能直接找到最大值或最小值,并不在意其它顺序的方法呢?

有!这个方法就是二叉堆!(详细内容请移步至二叉堆详解)

二叉堆的堆顶是该堆中的最大值或最小值
插入一个结点,即插入到二叉堆的最末尾,然后会再次调整构成二叉堆
删除一个结点,即删除堆顶,然后会再次调整构成二叉堆
所以可以借助二叉堆来实现优先队列,最大堆实现最大优先队列,最小堆实现最小优先队列

出队即把堆顶出队
入队即向二叉堆中插入一个结点
出队即删除堆顶
天作之合!完美~

下面是最大优先队列的代码实现。

优先队列的结构体即是二叉堆的结构体:

typedef struct {
int array[MAXSIZE];
int length;
} BinaryHeap, PriorityQueue;
入队操作:

/**

  • @description: 最大优先队列入队
  • @param {PriorityQueue} *queue 队列指针
  • @param {int} elem 入队元素
  • @return {*} 无
    */
    void en_max_queue(PriorityQueue *queue, int elem)
    {
    insert_into_max_heap(queue, elem);
    }
    出队操作:

/**

  • @description: 最大优先队列出队
  • @param {PriorityQueue} *queue 队列指针
  • @param {int} *elem 保存变量指针
  • @return {*} 无
    */
    void de_max_queue(PriorityQueue *queue, int *elem)
    {
    delete_from_max_heap(queue, elem);
    }
    函数 insert_into_max_heap、delete_from_max_heap 的实现在文章【二叉堆的原理及操作】中已经实现了,这里不再赘述。

作者:二十二画程序员
出处:https://www.cnblogs.com/xingrenguanxue/p/14737035.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
14
获赞与收藏
46

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消