優先佇列 priority queue

2021-09-25 20:10:49 字數 3435 閱讀 4468

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (first in, largest out)的行為特徵。通常採用堆資料結構來實現。

stl中的優先佇列priority_queue,包含在標頭檔案」queue」中,可以使用具有預設優先順序的已有資料結構;也可以再定義優先佇列的時候傳入自定義的優先順序比較物件;或者使用自定義物件(資料結構),但是必須過載好< 操作符。

定義: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(),這個類就有了類似函式的行為,就是乙個仿函式類了)

q.

empty

() 如果隊列為空,則返回true,否則返回false

q.size

() 返回佇列中元素的個數

q.pop(

) 刪除隊首元素,但不返回其值

q.top(

) 返回具有最高優先順序的元素值,但不刪除該元素

q.push

(item) 在基於優先順序的適當位置插入新元素

其中q.top()為查詢操作,在最小優先佇列中搜尋優先權最小的元素,在最大優先佇列中搜尋優先權最大的元素。q.pop()為刪除該元素。優先佇列插入和刪除元素的複雜度都是o(lgn),所以速度很快;另外,在優先佇列中,元素可以具有相同的優先權。

①預設優先順序:

通過《操作符可知在整數中元素大的優先順序高。

③傳入比較結構體,自定義優先順序。

#include 

using

namespace std;

struct cmp};

/**struct cmp

priority_queue q;

//優先佇列的研究2:資料結構的優先佇列方法

#include

#include

using

namespace std;

struct time

else

return t1.minute}else

return t1.hour}//最終的效果會是乙個大根堆 };

/*第二種過載方法,結構體外過載比較函式

struct cmp

while

(!q.

empty()

)return0;

}

**示例

#include 

#include

#include

#include

#include

using

namespace std;

struct cmp1};

struct node};

priority_queue<

int, vector<

int>

,cmp1>q2;

priority_queueq3;

intmain()

cout<

while

(!q3.

empty()

)return0;

}

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;

}

輸出

4 3 2 1 0

0 1 2 3 4

cbd abcd abc

2.pari的比較,先比較第乙個元素,第乙個相等比較第二個

#include 

#include

#include

using

namespace std;

intmain()

}

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

(c);

f.push

(b);

f.push

(a);

while

(!f.

empty()

)}

321

321

STL容器 優先佇列priority queue

priority queue顧名思義,是乙個具有權值概念的queue,它和queue一樣允許加入新元素 移除舊元素等功能。由於這是乙個queue,所以只允許在底部加入元素,從頂部取出元素。但優先佇列帶有權值概念,其內的元素自動按照元素的權值排序。權值最高者排在最前面。stl的priority que...

STL初步 優先佇列Priority queue

這個優先到底是如何優先?和普通佇列區別在哪?priority queue type,container,functional priority queue,less q priority queue,less a q priority queue,less b 優先佇列中沒有迭代器 也沒有clear...

優先順序佇列用法詳解(priority queue)

由於優先順序佇列的內部資料結構為堆,所以這裡先介紹堆的一些操作。堆的一些函式操作在algorithm標頭檔案中 在 first,last 範圍內 構造最大堆,first,last 可以是vector指標也可以是陣列指標 make heap first last make heap first las...