優先順序佇列,以前刷題的時候用的比較熟,現在竟然我只能記得它的關鍵字是priority_queue(太傷了)。在一些定義了權重的地方這個資料結構是很有用的。
先回顧佇列的定義:佇列(queue)維護了一組物件,進入佇列的物件被放置在尾部,下乙個被取出的元素則取自佇列的首部。priority_queue特別之處在於,允許使用者為佇列中儲存的元素設定優先順序。這種佇列不是直接將新元素放置在佇列尾部,而是放在比它優先順序低的元素前面。標準庫預設使用《操作符來確定物件之間的優先順序關係,所以如果要使用自定義物件,需要過載 < 操作符。
優先佇列有兩種,一種是最大優先佇列;一種是最小優先佇列;每次取自佇列的第乙個元素分別是優先順序最大和優先順序最小的元素。
1) 優先佇列的定義
包含標頭檔案:"queue.h", "functional.h"
可以使用具有預設優先順序的已有資料結構;也可以再定義優先佇列的時候傳入自定義的優先順序比較物件;或者使用自定義物件(資料結構),但是必須過載好< 操作符。
2) 優先佇列的常用操作
優先順序佇列支援的操作
q.empty() 如果隊列為空,則返回true,否則返回false
q.size() 返回佇列中元素的個數
q.pop() 刪除隊首元素,但不返回其值
q.top() 返回具有最高優先順序的元素值,但不刪除該元素
q.push(item) 在基於優先順序的適當位置插入新元素
其中q.top()為查詢操作,在最小優先佇列中搜尋優先權最小的元素,在最大優先佇列中搜尋優先權最大的元素。q.pop()為刪除該元素。優先佇列插入和刪除元素的複雜度都是o(lgn),所以很快
另外,在優先佇列中,元素可以具有相同的優先權。
下面這個c例子,包含了幾乎所有常見的優先佇列用法。
#include#include#include
#include
using
namespace
std;
//定義比較結構
struct
cmp1
};struct
cmp2
};//
自定義資料結構
struct
number1
};struct
number2
};int a=;
number1 num1=;
number2 num2=;
intmain()
for(i=0;num1[i].x;i++)
que5.push(num1[i]);
for(i=0;num2[i].x;i++)
que6.push(num2[i]);
printf(
"採用預設優先關係:/n(priority_queueque;)/n");
printf(
"queue 0:/n");
while(!que.empty())
puts(
"");
puts(
"");
printf(
"採用結構體自定義優先順序方式一:/n(priority_queue,cmp>que;)/n");
printf(
"queue 1:/n");
while(!que1.empty())
puts(
"");
printf(
"queue 2:/n");
while(!que2.empty())
puts(
"");
puts(
"");
printf(
"採用標頭檔案/
"functional/"
內定義優先順序:/n(priority_queue,greater/less>que;)/n");
printf(
"queue 3:/n");
while(!que3.empty())
puts(
"");
printf(
"queue 4:/n");
while(!que4.empty())
puts(
"");
puts(
"");
printf(
"採用結構體自定義優先順序方式二:/n(priority_queueque)/n");
printf(
"queue 5:/n");
while(!que5.empty())
puts(
"");
printf(
"queue 6:/n");
while(!que6.empty())
puts(
"");
return0;
}/*執行結果 :
採用預設優先關係:
(priority_queueque;)
queue 0:
91 83 72 56 47 36 22 14 10 7 3
採用結構體自定義優先順序方式一:
(priority_queue,cmp>que;)
queue 1:
3 7 10 14 22 36 47 56 72 83 91
queue 2:
91 83 72 56 47 36 22 14 10 7 3
採用標頭檔案"functional"內定義優先順序:
(priority_queue,greater/less>que;)
queue 3:
3 7 10 14 22 36 47 56 72 83 91
queue 4:
91 83 72 56 47 36 22 14 10 7 3
採用結構體自定義優先順序方式二:
(priority_queueque)
queue 5:
3 7 10 14 22 36 47 56 72 83 91
queue 6:
91 83 72 56 47 36 22 14 10 7 3
*/
STL 優先佇列的 優先順序
預設的優先佇列是個極大堆,如果要改變優先佇列中元素的優先順序,有下面這些方法 struct cmp1 struct cmp2 struct node2 priority queue,cmp q 定義方法 3 結構體宣告方式 struct node priority queueq 定義方法 在該結構中...
STL 優先佇列 定義 優先順序
預設的優先佇列是個極大堆,如果要改變優先佇列中元素的優先順序,有下面這些方法 struct cmp1 struct cmp2 struct node2 int u bool operator const node2 a const return uq1 採用預設優先順序構造佇列 priority q...
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...