題目30 哈夫曼樹 優先佇列

2021-10-04 06:27:23 字數 2344 閱讀 9221

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。

在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (first in, largest out)的行為特徵。

首先要包含標頭檔案#include, 他和queue不同的就在於我們可以自定義其中資料的優先順序, 讓優先順序高的排在佇列前面,優先出隊。

優先佇列具有佇列的所有特性,包括佇列的基本操作,只是在這基礎上新增了內部的乙個排序,它本質是乙個堆實現的。

和佇列基本操作相同

top 訪問隊頭元素

empty 佇列是否為空

size 返回佇列內元素個數

push 插入元素到隊尾 (並排序)

emplace 原地構造乙個元素並插入佇列

pop 彈出隊頭元素

swap 交換內容

定義:priority_queue

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 訪問隊頭元素...