STL中隊列queue的常見用法


網址:https://blog.csdn.net/weixin_43736974/article/details/87202381

一、queue(隊列)簡介:

隊列也是一種邏輯數據結構,其具有先進先出的特性,只能在隊的前端進行刪除, 在隊的后端進行插入。針對這種特性,可以實現一些較為復雜的邏輯。在實際應用中,部分程序也正需要這樣一種順序進出的數據處理方式。使用這樣的邏輯處理方式,使得我們可以將更多精力放在如何處理順序邏輯之外的事情,對於編程、開發來講,提供了極大的方便。

同stack類似,queue也可以看成是容器的容器,內部是使用其它容器來存放具體數據。加了一個外殼,使得我們的數據操作只能是在頭或尾。從尾部添加數據,從頭部取數據,從而實現FIFO的特性。同stack一樣,內部默認數據存放容器為deque,若要用非默認容器初始化,必須要在模板中指定容器類型。

定義:

需要定義兩個參數   1、元素類型(必須的)。

                                2、容器類型(不定義默認為deque)

                                 如:queue<int>a;

                                        queue<double>b,c,d;

 

 

二、隊列函數列表
queue入隊,如例:q.push(x); 將x 接到隊列的末端。

queue出隊,如例:q.pop(); 彈出隊列的第一個元素,注意,並不會返回被彈出元素的值。

訪問queue隊首元素,如例:q.front(),即最早被壓入隊列的元素。

訪問queue隊尾元素,如例:q.back(),即最后被壓入隊列的元素。

判斷queue隊列空,如例:q.empty(),當隊列空時,返回true。

訪問隊列中的元素個數,如例:q.size()

 

三、成員函數詳細說明:
 

1. push
隊列中由於是先進先出,push即在隊尾插入一個元素,如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.front()<<endl;
}
可以輸出:

2. pop
將隊列中最靠前位置的元素拿掉,是沒有返回值的void函數。如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
q.pop();
cout<<q.front()<<endl;
}
可以輸出:

原因是Hello World!已經被除掉了。

3. size
返回隊列中元素的個數,返回值類型為unsigned int。如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
cout<<q.size()<<endl;
q.push("Hello World!");
q.push("China");
cout<<q.size()<<endl;
}
輸出兩行,分別為   和  ,即隊列中元素的個數。

4. empty
判斷隊列是否為空的,如果為空則返回true。如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
cout<<q.empty()<<endl;
q.push("Hello World!");
q.push("China");
cout<<q.empty()<<endl;
}
輸出為兩行,分別是   和   。因為一開始隊列是空的,后來插入了兩個元素。

5. front
返回值為隊列中的第一個元素,也就是最早、最先進入隊列的元素。注意這里只是返回最早進入的元素,並沒有把它剔除出隊列。如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;
}
輸出值為兩行,分別是       和       。只有在使用了pop以后,隊列中的最早進入元素才會被剔除。

6. back
返回隊列中最后一個元素,也就是最晚進去的元素。如:

#include<bits/stdc++.h>
using namespace std;
int main()
{ queue<string> q;
q.push("Hello World!");
q.push("China");
cout<<q.back()<<endl;
}
輸出值為         ,因為它是最后進去的。這里back僅僅是返回最后一個元素,也並沒有將該元素從隊列剔除掉。

其他的方法不是很常用,就不再研究了。

 

C++ stl隊列queue示例代碼1:

#include<bits/stdc++.h>
using namespace std;
int main()
{ int e,n,m;
queue<int> q1;
for(int i=0;i<10;i++) q1.push(i);
if(!q1.empty()) cout<<"dui lie bu kong\n";
n=q1.size();
cout<<n<<endl;
m=q1.back();
cout<<m<<endl;
for(int j=0;j<n;j++)
{ e=q1.front();
cout<<e<<" ";
q1.pop();
}
cout<<endl;
if(q1.empty()) cout<<"dui lie kong\n";
n=q1.size(); cout<<"q1.zsize is "<<n<<endl;
system("PAUSE");
return 0;
}

四、應用舉例:
1、瓷磚

【問題描述】

在一個 w×h 的矩形廣場上,每一塊 1×1 的地面都鋪設了紅色或黑色的瓷磚。小林同學站在某一塊黑色的瓷磚上,他可以從此處出發,移動到上、下、左、右四個相鄰的且是黑色的瓷磚上。現在,他想知道,通過重復上述移動所能經過的黑色瓷磚數。

【輸入格式】

第 1 行為 h、w,2≤w、h≤50,之間由一個空格隔開。  

以下為一個 w 行 h 列的二維字符矩陣,每個字符為“.”“#”“@”,分別表示該位置為黑色的瓷磚、紅色的瓷磚,以及小林的初始位置。

【輸出格式】

輸出一行一個整數,表示小林從初始位置出發可以到達的瓷磚數。

【輸入輸出樣例】

11 9

.#.........

.#.#######.

.#.#.....#.

.#.#.###.#.

.#.#..@#.#.

.#.#####.#.

.#.......#.

.#########.

...........

 


【問題分析】

本題是典型的“求連通塊”問題,可以采用經典的“寬度優先搜索”算法求解,使用隊列維護。

 

2、關系網絡

【問題描述】

有 n 個人,他們的編號為 1~n,其中有一些人相互認識,現在 x 想要認識 y,可以通過他所認識的人來認識更多的人(如果 x 認識 y、y 認識 z,那么 x 可以通過 y 來認識 z),求出 x 最少需要通過多少人才能認識 y。

【輸入格式】

第 1 行 3 個整數 n、x、y,n≤100,1≤x、y≤n。

接下來是一個 n×n 的鄰接矩陣,a[i,j]=1 表示 i 認識 j,0 表示不認識。  

保證 i=j 時,a[i,j]=0,並且 a[i,j]=a[j,i]。行中的每兩個數之間用一個空格分開。

【輸出格式】

輸出一行一個數,表示 x 認識 y 最少需要通過的人數。

【樣例輸入】

5 1 5

0 1 0 0 0

1 0 1 1 0

0 1 0 1 0

0 1 1 0 1

0 0 0 1 0

【樣例輸出】

2

【問題分析】

本題是典型的“求最優值”問題,可以通過經典的“寬度優先搜索”算法解決,使用隊列維護。
————————————————
版權聲明:本文為CSDN博主「流年15096301719」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43736974/article/details/87202381


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM