普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。
在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (first in, largest out)的行為特徵。
首先要包含標頭檔案#include, 他和queue不同的就在於我們可以自定義其中資料的優先順序, 讓優先順序高的排在佇列前面,優先出隊。
優先佇列具有佇列的所有特性,包括佇列的基本操作,只是在這基礎上新增了內部的乙個排序,它本質是乙個堆實現的。
和佇列基本操作相同定義:priority_queuetop 訪問隊頭元素
empty 佇列是否為空
size 返回佇列內元素個數
push 插入元素到隊尾 (並排序)
emplace 原地構造乙個元素並插入佇列
pop 彈出隊頭元素
swap 交換內容
type 就是資料型別,container 就是容器型別(container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector),functional 就是比較的方式。
當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆。
//公升序佇列
priority_queue <
int,vector<
int>
,greater<
int>
> q;
//降序佇列
priority_queue <
int,vector<
int>
,less<
int>
>q;
//greater和less是std實現的兩個仿函式(就是使乙個類的使用看上去像乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了)
1、基本型別優先佇列的例子:
#include
#include
using
namespace std;
intmain()
while
(!a.
empty()
) cout << endl;
while
(!c.
empty()
) cout << endl;
b.push
("abc");
b.push
("abcd");
b.push
("cbd");
while
(!b.
empty()
) cout << endl;
return0;
}
執行結果:
432
1001
234cbd abcd abc
請按任意鍵繼續.
..
2、用pair做優先佇列元素的例子:
規則:pair的比較,先比較第乙個元素,第乙個相等比較第二個。
#include
#include
#include
using
namespace std;
intmain()
}
執行結果
251
312請按任意鍵繼續.
..
3、用自定義型別做優先佇列元素的例子
#include
#include
using
namespace std;
//方法1
struct tmp1 //運算子過載<
bool
operator
<
(const tmp1& a)
const};
//方法2
struct tmp2 //重寫仿函式};
intmain()
cout << endl;
priority_queue
, tmp2> f;
f.push
(b);
f.push
(c);
f.push
(a);
while
(!f.
empty()
)}
執行結果
321回車321
請按任意鍵繼續. . .
優先佇列 哈夫曼樹
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和的最小值。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 ...
30 題目1172 哈夫曼樹
題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...
優先佇列 修理牧場 哈夫曼樹
主要還是要記錄一下這個優先佇列 定義 priority queue 公升序佇列 priority queue int,vector int greater int q 降序佇列 priority queue int,vector int less int q 和佇列基本操作相同 top 訪問隊頭元素...