C 優先佇列 priority queue

2021-10-05 18:16:32 字數 1516 閱讀 5621

priority_queue底層是用堆來實現的,因此可以把它看成乙個堆。預設是值大的優先順序高。

#include

#include

using

namespace std;

intmain()

輸出結果為 8

我們可以改變優先順序,要在優先佇列的定義中新增引數:

priority_queue<

int, vector<

int>

, greater<

int>> q;

q.push(4

);q.push(8

);q.push(2

);cout << q.

top(

)<< endl;

輸出結果為 2

priority_queue, greater> q第乙個引數表示佇列的資料型別,第二個引數表示承載底層資料結構「堆」的容器,第三個引數greater表示數字小的優先順序高,若是less則表示數字大的優先順序高。

如果佇列中的資料型別是複雜的結構體,那麼需要進行運算子過載。

#include

#include

using

namespace std;

struct fruit };

intmain()

cout << q.

top(

).name <<

": "

<< q.

top(

).price << endl;

return0;

}輸入:

蘋果 3.54

鴨梨 4.53

櫻桃 9.78

獼猴桃 7.69

香蕉 2.35

輸出結果為:香蕉 2.34

**中的友元函式用來過載運算子<,相當於告訴優先佇列,你以為的大值就是price的小值。所以優先佇列按price從小到大排列。

在結構體中過載了運算子,優先佇列的定義中就不需要第二個、第三個引數。

也可以把友元函式從結構體中拿出來,此時需要在優先佇列的定義中新增第二個、第三個引數:

#include

#include

using

namespace std;

struct fruit

;struct cmp };

intmain()

cout << q.

top(

).name <<

": "

<< q.

top(

).price << endl;

return0;

}輸入:

蘋果 3.54

鴨梨 4.53

櫻桃 9.78

獼猴桃 7.69

香蕉 2.35

輸出結果為:香蕉 2.34

用二叉堆實現優先佇列 Priority Queue

優先佇列出隊跟佇列一樣,從隊首出隊 但隊內的次序由優先順序決定,即優先順序高的資料項可以插隊,排到前面。二叉堆能夠將優先佇列的入隊和出隊複雜度都保持在o logn 完全二叉樹,如果用順序表來表示的話,設根節點下標為1,若某節點下標為p,則其左子節點下標為2p,右子節點下標為2p 1,父節點下標為p ...

C 優先佇列

半題外話 優先佇列個人認為主要優點是可以在排序後進行類似於插入排序的操作,適合於需要在陣列排序後再次進行操作的題目 再由此產生一堆bug 本蒟蒻是在敲貪心的題時遇見的 弱得連個貪心都不會敲了呵 就開始了學 mo 習 ca 之旅 優先佇列的結構 佇列1.back 返回乙個引用,指向最後乙個元素 2.e...

c 優先佇列

優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。這點類似於給佇列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素值由大到小排序,可以過載 操作符來重新定義...