![算法训练营:海量图解+竞赛刷题(进阶篇)](https://wfqqreader-1252317822.image.myqcloud.com/cover/239/47379239/b_47379239.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
原理2 优先队列详解
普通的队列是一种先进先出的数据结构,从队尾入队,从队头出队。在优先队列中,元素被赋予优先级,优先级高的元素先出队。上节介绍了优先队列的实现原理,在实际的算法实现中,可以直接调用C++中的STL函数priority_queue,在Java中也提供了优先队列接口PriorityQueue。
优先队列priority_queue的成员函数如下。
• empty():若优先队列为空,则返回真。
• pop():出队。
• push():入队。
• top():取堆顶(队头),返回优先队列中优先级最高的元素。
• size():返回优先队列中元素的个数。
优先队列的用法:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-36-1.jpg?sign=1739360757-dxdQw4pGVrmaeoTLf3n9Oa2N3qa0JBZp-0-b5a223346e3373252e85124b88cfbd7d)
其中,第1个参数为数据类型,第2个参数为容器类型,第3个参数为比较函数。后两个参数根据需要也可以省略。
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-36-2.jpg?sign=1739360757-lic6KxRzmKEr5oUCHEtDcrRMkEUq12Pq-0-06bf143595dab4125e220f4e6734d61d)
如何控制优先队列的优先级?若不是最大值优先,则可以采用下面4种方法。
(1)使用C++自带的库函数<functional>。首先,在头文件中引用include库函数:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-36-3.jpg?sign=1739360757-8CoqCPa0UNNlstPFuFDVmoCxxtLEO8jF-0-eb6c9c681b8db495bc7dfaa8a665ed3c)
functional提供了以下基于模板的比较函数对象。
• equal_to<Type>:等于。
• not_equal_to<Type>:不等于。
• greater<Type>:大于。
• greater_equal<Type>:大于或等于。
• less<Type>:小于。
• less_equal<Type>:小于或等于。
其次,创建优先队列:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-36-4.jpg?sign=1739360757-zFX0gsIkFy0PyAxO1ejE8UQ4avGKewh9-0-524f11e93b39aab662b55d9efff82bd6)
注意:“>>”会被认为错误,它是右移运算符,这里用空格号隔开,表示的含义不同。
(2)自定义优先级①,队列元素为数值型:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-36-5.jpg?sign=1739360757-haGVRM6O256iyFUZKFmeYFHIOaWGKl1D-0-c68fec6bc0c032950eb0baf689bbaee0)
创建优先队列:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-37-1.jpg?sign=1739360757-hyFkiLPJUQ8SxGcT05TjUQ9gX0y1nH0w-0-c0a9b6ea9dddeb4f5f41ae5188af24ae)
(3)自定义优先级②,队列元素为结构体类型:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-37-2.jpg?sign=1739360757-hPHhISuU2Mma5ETCbAdUTpwrocanMcfb-0-32cac33e306ba208fe991a4d726efb19)
创建优先队列:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-37-3.jpg?sign=1739360757-AF4YJNWD4eDedZGxgE3OYAKU4er9Jz3R-0-220e152698a2ed56a751eb8be4bcb797)
(4)自定义优先级③,队列元素为结构体类型:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-37-4.jpg?sign=1739360757-oMoSA8dFmRNk9YYTBrGA4qETNUb12fp7-0-7a6dc2c55c9468c5521c264c5f893115)
创建优先队列:
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-37-5.jpg?sign=1739360757-RRB5xlapD6AJThXmlJq3QlYTq9T0Zr5w-0-5c0725895b1fab8c13ec129121ade874)