演算法之優先順序佇列
阿新 • • 發佈:2018-12-30
<1>概念
優先順序佇列,顧名思義,就是一種根據一定優先順序儲存和取出資料的佇列。它可以說是佇列和排序的完美結合體,不僅可以儲存資料,還可以將這些資料按照我們設定的規則進行排序。優先順序佇列是堆的一種常見應用。有最大優先順序佇列(最大堆)和最小優先順序佇列(最小堆)。優先順序佇列是一種維護有一組元素構成的集合S的資料結構。
<2>優先佇列支援的基本運算
//建立一個儲存元素為int的優先順序佇列,其實是建了一個小頂堆 //但是請特別注意這樣的建的堆預設是大頂堆,即我們從堆頂去的元素是整個堆中元素最大的。 priority_queue<int> Heap; //可以這樣建一個表示小頂堆的優先順序佇列 priority_queue<int , vector<int>, greater<int> > Heap; //將元素x放入優先順序佇列中 Heap.push(x); //取出優先順序佇列第一個元素(堆頂元素),儲存在x中 int x = Heap.top(); //彈出堆頂元素,取出後堆會自動調整為一個最小堆(最大堆) Heap.pop(); //判斷是否為空 Heap.empty(); //標頭檔案 #include<queue>
<3>自定義優先順序
新增元素為結構體需要過載'<'
#include<iostream> #include<stdio.h> #include<queue> using namespace std; struct Node { //值 int value; //編號 int key; //過載操作符 friend bool operator < (Node node1,Node node2) { //最大優先佇列 return node1.value < node2.value; } /* 不要過載這個'>'只過載'<' friend bool operator > (Node node1,Node node2) { return node1.value > node2.value; } */ }; struct Node2 { //值 int value; //編號 int key; //過載操作符 friend bool operator < (Node2 node1,Node2 node2) { //最小優先佇列 return node1.value > node2.value; } }; int main(){ int i; //例項一 結構體1 Node b[5]; b[0].value = 6; b[0].key = 1; b[1].value = 9; b[1].key = 2; b[2].value = 2; b[2].key = 3; b[3].value = 8; b[3].key = 4; b[4].value = 1; b[4].key = 5; //最大優先佇列 priority_queue<Node> Heap; //入佇列 for(i = 0;i < 5;i++){ Heap.push(b[i]); } printf("最大優先佇列:\n"); //出佇列 for(i = 0;i < 5;i++){ printf("key:%d value:%d\n",Heap.top().key,Heap.top().value); Heap.pop(); } //例項二 結構體2 Node2 b2[5]; b2[0].value = 6; b2[0].key = 1; b2[1].value = 9; b2[1].key = 2; b2[2].value = 2; b2[2].key = 3; b2[3].value = 8; b2[3].key = 4; b2[4].value = 1; b2[4].key = 5; //最大優先佇列 priority_queue<Node2> Heap2; //入佇列 for(i = 0;i < 5;i++){ Heap2.push(b2[i]); } printf("最小優先佇列:\n"); //出佇列 for(i = 0;i < 5;i++){ printf("key:%d value:%d\n",Heap2.top().key,Heap2.top().value); Heap2.pop(); } return 0; }
注意:
struct Node
{
//值
int value;
//編號
int key;
friend bool operator > (Node node1,Node node2)
{
return node1.value > node2.value;
}
};
這樣會報錯。因為標準庫預設使用元素型別的<操作符來確定它們之間的優先順序關係。