1. 程式人生 > >演算法之優先順序佇列

演算法之優先順序佇列

<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;  
    } 
};

這樣會報錯。因為標準庫預設使用元素型別的<操作符來確定它們之間的優先順序關係。

                   看病要排隊

                   搬水果