關於priority queue容器

2021-10-01 10:36:56 字數 1315 閱讀 8280

queue佇列和stack棧結構很像,他們都是有乙個結點只有前驅結點,有乙個結點只有後繼節點,剩下的結點都有乙個前驅結點、乙個後繼節點的線性表。他們兩個都有同樣不方便的地方:queue只允許在隊尾新增資料,在隊頭刪除資料。但是可以檢視隊頭和隊尾的資料(先進先出)。而stack只允許在棧頂進行插入刪除操作(先進後出)。

這兩個資料結構在遇到某些很卡輸出的題,就會很頭疼!但是有個優先佇列priority_queue,可以改變原先佇列輸出難的問題:優先佇列與佇列的差別在於優先佇列不是按照入隊的順序出隊,而是按照佇列中元素的優先權順序出隊。但優先佇列的難題也就是賦給元素的優先權。

優先順序佇列(priority queue) 是0個或多個元素的集合,每個元素都有乙個優先權,對優先順序佇列執行的操作有(1)查詢(2)插入乙個新元素 (3)刪除。 一般情況下,查詢操作用來搜尋優先權最大的元素,刪除操作用來刪除該元素 。對於優先權相同的元素,可按先進先出次序處理或按任意優先權進行。底層是用堆實現的,其複雜度為push():o(logn)、pop():o(logn)、top():o(1)。

1、 標頭檔案:#include< queue >

2、priority_queue中元素怎麼比較?

模板申明帶3個引數:priority_queue,其中type 為資料型別,container為儲存資料的容器,functional 為元素比較方式。container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector。

比較方式 functional預設用operator「<」,(less,表示數字大的優先順序高,可省略,而 greater 表示數字小的優先順序高,不可省略),所以如果把後面2個引數預設的話,優先佇列就是大頂堆(降序),隊頭元素最大。而 greater 表示數字小的優先順序高。

接下來試驗乙個大頂堆的輸出:

#include

#include

using

namespace std;

intmain()

return0;

}

接下來再來個從小到大輸出:

#include

#include

#include

using

namespace std;

intmain()

return0;

}

上面是用了stl提供的仿函式greater<>,less<>,簡化了自己再定義排序函式的過程。如果想自己定義結構,而不想使用基本資料型別,就需要過載運算子。

關於最小堆以及priority queue

今天刷題用到了最小堆,想直接用stl庫去實現,無奈用得少,不太熟練,現在把剛學到的列在這兒。最小堆 最大堆 可以有兩種實現方法 vector和priority queue,不過兩種的底層實現是一樣的。這裡主要是針對自定義的資料結構。1.兩種方法可以都過載 運算子來確定優先順序 注意 必須是 操作符 ...

關於優先佇列 priority queue 的使用

include include includeusing namespace std struct node return n1.value n2.value 最大優先佇列,類似的還有最小優先佇列把小於改為大於 int main printf n 示例二 priority queue,greater...

PriorityQueue實現原理

priorityqueue priorityqueue是個基於優先順序堆的極大優先順序佇列 此佇列按照在構造時所指定的順序對元素排序,既可以根據元素的自然順序來指定排序 參閱 comparable 也可以根據 comparator 來指定 這取決於使用哪種構造方法。優先順序佇列不允許 null 元素...