1. 程式人生 > >C++之佇列和優先佇列

C++之佇列和優先佇列

C++ queue(佇列)Priority queue(優先佇列)

【queue】

C++佇列是一種容器介面卡,它給予程式設計師一種先進先出(FIFO)的資料結構。
1.back() 返回一個引用,指向最後一個元素
2.empty() 如果佇列空則返回真
3.front() 返回第一個元素
4.pop() 刪除第一個元素
5.push() 在末尾加入一個元素
6.size() 返回佇列中元素的個數

佇列可以用線性表(list)或雙向佇列(deque)來實現(注意vector container 不能用來實現queue,因為vector 沒有成員函式pop_front!):
queue<list<int>> q1;


queue<deque<int>> q2;
其成員函式有“判空(empty)” 、“尺寸(Size)” 、“首元(front)” 、“尾元(backt)” 、“加入佇列(push)” 、“彈出佇列(pop)”等操作。

DEMO

int main()
{
    queue<int> q;//沒有指明佇列的 
    q.push(4);
    q.push(5);
   printf("%d\n",q.front());
   q.pop();
}

【Priority queue】

優先順序佇列 是不同於先進先出佇列的另一種佇列。每次從佇列中取出的是具有最高優先權的元素。優先佇列是0個或多個元素的集合,每個元素都有一個優先權或值,對優先佇列執行的操作有1) 查詢;2) 插入一個新元素;3) 刪除.

在最小優先佇列(min priority queue)中,查詢操作用來搜尋優先權最小的元素,刪除操作用來刪除該元素;對於最大優先佇列(max priority queue),查詢操作用來搜尋優先權最大的元素,刪除操作用來刪除該元素.優先權佇列中的元素可以有相同的優先權,查詢與刪除操作可根據任意優先權進行.

標頭檔案:C++標頭檔案 #include <queue>

定義:template<typename _Tp, typename _Sequence = vector<_Tp>,typename _Compare  = less<typename _Sequence::value_type> >

第一個引數 _Tp: 指定儲存的型別名稱;
第二個引數 _Sequence: 指定儲存的資料結構,該結果必須支援隨機存取迭代器;
第三個引數 _Compare : 比較函式,對於自定義型別有兩種方法實現大小頂堆,第一個是過載操作符,第二個是寫一個結構實現比較。
DEMO

#include<stdio.h>  
#include<functional>  
#include<queue>  
#include<vector>  
using namespace std;  
//定義結構,使用運算子過載,自定義優先順序1  
struct cmp1{  
    bool operator ()(int &a,int &b){  
        return a>b;//最小值優先  
    }  
};  
struct cmp2{  
    bool operator ()(int &a,int &b){  
        return a<b;//最大值優先  
    }  
};  
//定義結構,使用運算子過載,自定義優先順序2  
struct number1{  
    int x;  
    bool operator < (const number1 &a) const {  
        return x>a.x;//最小值優先  
    }  
};  
struct number2{  
    int x;  
    bool operator < (const number2 &a) const {  
        return x<a.x;//最大值優先  
    }  
};  
int a[]={14,10,56,7,83,22,36,91,3,47,72,0};  
number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};  
number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};  
  
int main()  
{   priority_queue<int>que;//採用預設優先順序構造佇列  
  
    priority_queue<int,vector<int>,cmp1>que1;//最小值優先  
    priority_queue<int,vector<int>,cmp2>que2;//最大值優先  
  
    priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”會被認為錯誤,  
                                                      //這是右移運算子,所以這裡用空格號隔開  
    priority_queue<int,vector<int>,less<int> >que4;////最大值優先  
  
    priority_queue<number1>que5;  
    priority_queue<number2>que6;  
  
    int i;  
    for(i=0;a[i];i++){  
        que.push(a[i]);  
        que1.push(a[i]);  
        que2.push(a[i]);  
        que3.push(a[i]);  
        que4.push(a[i]);  
    }  
    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_queue<int>que;)\n");  
    printf("Queue 0:\n");  
    while(!que.empty()){  
        printf("%3d",que.top());  
        que.pop();  
    }  
    puts("");  
    puts("");  
  
    printf("採用結構體自定義優先順序方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");  
    printf("Queue 1:\n");  
    while(!que1.empty()){  
        printf("%3d",que1.top());  
        que1.pop();  
    }  
    puts("");  
    printf("Queue 2:\n");  
    while(!que2.empty()){  
        printf("%3d",que2.top());  
        que2.pop();  
    }  
    puts("");  
    puts("");  
    printf("採用標頭檔案\"functional\"內定義優先順序:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");  
    printf("Queue 3:\n");  
    while(!que3.empty()){  
        printf("%3d",que3.top());  
        que3.pop();  
    }  
    puts("");  
    printf("Queue 4:\n");  
    while(!que4.empty()){  
        printf("%3d",que4.top());  
        que4.pop();  
    }  
    puts("");  
    puts("");  
    printf("採用結構體自定義優先順序方式二:\n(priority_queue<number>que)\n");  
    printf("Queue 5:\n");  
    while(!que5.empty()){  
        printf("%3d",que5.top());  
        que5.pop();  
    }  
    puts("");  
    printf("Queue 6:\n");  
    while(!que6.empty()){  
        printf("%3d",que6.top());  
        que6.pop();  
    }  
    puts("");  
    return 0;  
}  
執行結果:
採用預設優先關係:
(priority_queue<int>que;)
Queue 0:
 91 83 72 56 47 36 22 14 10  7  3
採用結構體自定義優先順序方式一:
(priority_queue<int,vector<int>,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<int,vector<int>,greater<int>/less<int> >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_queue<number>que)
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

相關推薦

C++佇列優先佇列

C++ queue(佇列)Priority queue(優先佇列) 【queue】 C++佇列是一種容器介面卡,它給予程式設計師一種先進先出(FIFO)的資料結構。1.back() 返回一個引用,指向最後一個元素2.empty() 如果佇列空則返回真3.front()

FIFO佇列優先佇列

FIFO佇列 定義:先進先出的儲存結構(刪除時先刪最後一個元素) queue<型別> q; 增: q.push(元素值); //在隊尾加入一個元素 void 刪: q.pop(); //刪除

合併果子(佇列優先佇列

有兩種方法 一種是佇列 一種是優先佇列(priority_queue) 這兩種方法的區別是佇列定義時沒有自動排序 所以只能在輸入的時候按順序才能輸出正解(所以佇列的方法不被認為是正解) 下面是程式碼 比較簡便: #include<bits/stdc++.h> using na

JAVA 線性表、棧、佇列優先佇列

線性表、棧、佇列和優先佇列 資料結構是以某種形式將資料組織在一起的合集。資料結構不僅儲存資料,還支援訪問和處理資料的操作。 JAVA的合集框架如下圖所示 合集 JAVA合集框架支援兩種型別的容器: 一種是儲存一個元素合集,簡稱合集。 另一種是為了儲存鍵、值對,稱

堆、堆排序優先佇列的那些事

1. 什麼是堆? 堆是一種資料結構,它是一顆完全二叉樹。 堆分為最大堆和最小堆: 最大堆:任意節點的值不大於其父親節點的值。 最小堆:任意節點的值不小於其父親節點的值。 如下圖所示,就是個最大堆: 注:本文中的程式碼實現是最大堆,最小堆的實現相似,不再冗贅。 2. 堆有什麼用途? 堆最常用於優先

二叉樹(堆優先佇列

堆是一種特殊的二叉樹。 最小值堆:最小值堆的特性。 對於堆的任意非葉節點K,K的值總是小於或者等於左右子節點。 K <= 左節點;K <= 又節點; 堆例項: 堆實際上是一個完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1)

資料結構與演算法隨筆------堆與優先佇列

 堆是什麼?是一種特殊的完全二叉樹,就像下面這棵樹一樣。         有沒有發現這棵二叉樹有一個特點,就是所有父結點都比子結點要小(注意:圓圈裡面的數是值,圓圈上面的數是這個結點的編號,此規定僅適用於本節)。符合這樣特點的完全二叉樹我們稱為最小堆。反之,如果

使用並查集UnionFind優先佇列PriorityQueue實現Kruskal演算法

拿到題目,先看看UnionFind 和 PriorityQueue 怎麼實現吧,誰讓上課沒好好聽呢。 Kruskal演算法是通過按照權值遞增的順序依次選擇圖中的邊,當邊不處於同一連通分量時加入生成樹,

最小的N個(優先佇列)

題目描述 有兩個長度為N的序列A和B,在A和B中各任取一個數相加可以得到N2個和,求這N2個和中最小的N個。 輸入 第一行輸入一個正整數N(1<=N<=100000); 第二行N個整數Ai且Ai<=109;第三行N個整數Bi且Bi<

堆Heap優先佇列(Priority Queue)學習小結

Heap是一種資料結構,能保證取max/min是O(1)時間。通常如果查最小值/最大值,我們可以用Heap。如果是查是不是存在(Contain()),就用HashMap。如果又要查最小/大值,又要查是不是存在,就用Heap+HashMap. Max-heap/M

rabbimq佇列死信佇列延遲佇列

        在專案開發設計過程中,我們經常用到非同步推送的場景,比如下單和扣減庫存非同步執行。常用的非同步中介軟體有mq有很多,我們這裡以Rabbitmq為例進行講解。我們知道只要是涉及非同步場景的問題,就有成功失敗之分,如果生產者傳送訊息一直失敗要怎麼做呢,這裡我們就用

FIFO佇列(First In First Out)優先佇列

queue<型別名> q; q.size() — 返回佇列中元素個數 q.empty() — 若佇列為空,返回true ,否則返回false q.pop() — 刪除

iOS-多執行緒程式設計學習GCD——序列佇列併發佇列(五)

  Grand Central Dispatch(GCD)有很多部分構成,例如有很好的語言特性,執行庫,還提供了系統的、高效的方式來支援具有多核處理器的iOS和OS X裝置進行併發事件處理。   BSD子系統,CoreFoundation和Cocoa APIs

資料結構實現最小優先佇列(最小堆)

package xwq.dt; import java.util.Comparator; import java.util.Iterator; import java.util.NoSuchElementException; import xwq.util.

軟體開發實踐中的入佇列佇列操作的C程式碼示例

概述 最近有在校的學生朋友在問我,資料結構中的佇列在實際的軟體開發專案中有什麼樣的用處。 大家都知道,佇列的特點是先入先出,即資料是按照入佇列的順序出佇列的。在實際的軟體開發專案中,當一箇中間模組需要接收和傳送大量的訊息時,佇列就可以大展身手了。我們可以將接

HDU4006 The kth great number————棧佇列優先佇列

Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao w

淺談C++ STL中的優先佇列(priority_queue)

開發十年,就只剩下這套架構體系了! >>>   

C goto void(八)

C語言 goto void 我們在 C 語言中經常會見到 void ,也會偶爾見到 goto。那麽 C 語言中既然有 goto ,為什麽我們在代碼中見的很少呢?在以前很多的項目經驗中,我們得到這樣一條潛規則:一般項目都是禁用 goto 的,程序質量與 goto 的出現次數成反比。自

C const volatile(九)

C語言 const volatile 在 C 語言中,我們經常會見到 const 和 volatile 這兩個關鍵字,那麽我們今天就來介紹下這兩個關鍵字。 先來介紹 const 關鍵字。提起 const 關鍵字,我們可能首先想到的是經過它修飾的變量便是常量了。其實我

C struct union(十)

C語言 struct union 在 C 語言中我們經常會使用到 struct 和 union,那麽它們兩個各自有何特點呢?今天我們就一探究竟。 我們先來介紹下 struct 。它可以看做是變量的集合,那麽一個空的結構體占多大內存呢?這是一個有趣的問題,按照理論分析,