1. 程式人生 > >STL—queue(佇列)詳解

STL—queue(佇列)詳解

首先,在STL中queue&&stack其實並不叫容器(container),而是叫介面卡(adapter),他們是對容器的再封裝.

佇列queue:

佇列,簡稱對,是一種操作受限 的線性表。限制為:只允許在隊首刪除(出隊),隊尾插入(入隊),其特點是先進先出。在STL中,queue作為一種介面卡,其底層容器一般為deque(雙端佇列)和list(雙向連結串列),其中deque為預設底層容器。

標頭檔案
 #include<queue>
建立queue物件:
模板:queue<資料型別,容器型別> q;

資料型別:可以是int、double等基本型別,也可以是自定義的結構體。 容器型別:一般為deque(雙端列隊)或者list(雙向連結串列),可省略,省略時以deque為預設容器。 q:佇列名。

宣告程式碼如下:
queue<int> q;  //使用預設的雙端佇列為底層容器建立一個空的queue佇列物件q,資料元素為int型別。
queue<int> q[20];  //規定佇列元素數量
queue<int,list<int>> q1;
queue<int,list<int>> q2(q1);
//複製建構函式(queue(const queue&)),用一個queue物件建立新的queue物件。 
//利用queue物件q1,建立一個以雙向連結串列為底層容器的queue物件q2
基本操作:

在文章結尾出有程式碼示例

q.push(x);      //入隊,將元素 x 從隊尾插入(尾插法)
q.pop();        //出隊,刪除對首元素,並返回其值
q.size();       //返回隊中元素個數
q.front();      //返回對首元素
q.back();       //返回隊尾元素
q.empty();      //判斷是否為空(空返回 1,非空返回 0)

優先佇列priority_queue

優先佇列是一種會按照預設或自定義的優先順序進行自動排序的佇列,其特點是優先順序高的元素排在隊首,低的排在隊尾。標頭檔案#include< queue > 中提供了兩種可直接引用的優先規則(排序規則):greatr、less;其中,greatr是預設優先規則,表示數字小的優先順序大(字元型用ASCLL碼比較),放在隊首;lees表示數字大的優先順序大,放在隊首

標頭檔案

#include<queue>

建立priority_queue物件:

模板:priority_queue< 資料型別,容器型別,優先規則> pq;

資料型別:可以是int、double等基本型別,也可以是自定義的結構體。 容器型別:一般為deque(雙端列表)、vector(向量容器),可省略,省略時以vector為預設容器。 pq:優先佇列名。

宣告程式碼如下:

預設宣告:

priority_queue<int> pq;

手動宣告:

priority_queue<int,vector<int>,less<int> > pq;   //以less為排列規則(大頂堆,表示頂堆元素比其他都大)

priority_queue<int,vector<int>,greatr<int> > pq; //以greatr為排列規則(小頂堆,表示頂堆元素比其他都小)

利用過載操作符定義優先順序(其實也是遞增和遞減兩種排序規則)

非結構體:

struct lei
{
        bool operator () (const int &a,const int &b)
       {
            return a>b;   //相當於greatr,a<b則相當於less
       }
}
另:
struct lei
{
    bool operator()(int a,int b)
    {
        return a>b;   //相當於greatr,(小頂堆);a<b相當於less
    }
}
引用方式:
priority_queue<int,vector<int>,lei> pq;

結構體:

struct lei
{
    int n;
    double m;
    friend bool operator < (lei a,lei b)
    {
        return a.n>b.n;   //以n做優先順序比較,相當於greatr
    }
}a,b
另:
struct lei
{
    int n;
    double m;
    bool operator < (const lei &a) const
    {
        return a.n>n;    //以n做優先順序比較,相當於greatr
    }
}a;
引用方式:priority_queue<lei > pq;
struct lei
{
     int n;
     double m;
}a,b;
struct mop
{
     bool operator ()(lei a,lei b)
     {
         return a.n>b.n;//相當於greatr(小頂堆)
     }
};
引用方式:priority_queue<lei,vector<lei>,mop> pq;
基本操作
pq.push();    //入隊
pq.pop();     //出隊
pq.size()     //返回當前對中元素個數
pq.top();     //優先佇列   取隊首元素
pq.empty();   //判斷是否為空(空返回 1,非空返回 0)

佇列的程式碼示例

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    printf("\n判斷佇列是否為空(空為真:1,非空為假:0):\n");
    cout<<q.empty()<<endl;
    printf("返回佇列元素個數:\n");
    cout<<q.size()<<endl;
    printf("\n讀取隊首元素:\n");
    cout<<q.front()<<endl;
    printf("所有元素出隊(刪除所有元素):\n");
    while(q.empty()!=true)
    {
         cout<<q.front()<<endl;
         q.pop();
    }
    printf("\n判斷佇列是否為空(空為真:1,非空為假:0):\n");
    cout<<q.empty()<<endl;
    return 0;
}

示例了佇列的各項基本操作

優先佇列程式碼示例

#include<iostream>
#include<queue>
using namespace std;
struct lei            //定義優先順序
{
     bool operator ()(int a,int b)
     {
          return a<b; //大頂堆,相當於less
     }
};
int main()
{
     priority_queue<int,vector<int>,lei> pq;
     printf("入隊操作:1,2,3\n\n");
     pq.push(1);
     pq.push(2);
     pq.push(3);
     printf("\n判斷佇列是否為空(空為真:1,非空為假:0):\n");
     cout<<pq.empty()<<endl;
     printf("返回佇列元素個數:\n");
     cout<<pq.size()<<endl;
     printf("\n讀取隊首元素:\n");
     cout<<pq.top()<<endl;
     printf("所有元素出隊(刪除所有元素):\n");
     while(pq.empty()!=true)
     {
          cout<<pq.top()<<endl;
          pq.pop();
     }
     printf("\n判斷佇列是否為空(空為真:1,非空為假:0):\n");
     cout<<pq.empty()<<endl;
     cout<<endl;
     return 0;
}

優先佇列的各項基本操作示例