queue單向隊列與棧有點相似,一個是在同一端存取數據,另外一個是在一端存入數據,另外一端取出數據。單向隊列中的數據是先進先出(First In First Out,FIFO)。ios
在STL中,單向隊列也是以別的容器做爲底部結構,再將接口改變,使之符合單向隊列的特性就能夠了。所以實現也是很是方便的。less
單向隊列一共6個經常使用函數(front()、back()、push()、pop()、empty()、size()),與棧的經常使用函數較爲類似。函數
與stack 模板類很類似,queue 模板類也須要兩個模板參數,一個是元素類型,一個容器類型,元素類型是必要的,容器類型是可選的,默認爲deque 類型。spa
queue 模板類的定義在<queue>頭文件中 ,必須用宏語句 "#include <queue>" 包含進來,纔可對 queue隊列的程序進行編譯。
code
queue<int> q1; queue<double> q2;
q.push(x); //入隊,將x 接到隊列的末端
q.pop(); //出隊,彈出隊列的第一個元素,注意,並不會返回被彈出元素的值
(4)訪問隊首元素orm
q.front(); //訪問隊首元素,即最先被壓入隊列的元素
q.back() //訪問隊尾元素,即最後被壓入隊列的元素
q.empty() //判斷隊列空,當隊列空時,返回true
q.size() //訪問隊列中的元素個數
在<queue>頭文件中,還定義了另外一個很是有用的模板類priority_queue(優先隊列)。對象
優先隊列與隊列的差異在於優先隊列不是按照入隊的順序出隊,而是按照隊列中元素的優先權順序出隊(默認爲大者優先,也能夠經過指定算子來指定本身的優先順序)。接口
priority_queue 模板類有三個模板參數:第一個是元素類型,第二個容器類型,第三個是比較算子。隊列
其中後兩個均可以省略,默認容器爲vector,默認算子爲less,即小的往前排,大的日後排(出隊時序列尾的元素出隊)。it
定義priority_queue 對象的示例代碼以下:
priority_queue<int> q1; priority_queue< pair<int, int> > q2; // 注意在兩個尖括號之間必定要留空格。 priority_queue<int, vector<int>, greater<int> > q3; // 定義小的先出隊
priority_queue 的基本操做與queue 相同。
初學者在使用priority_queue 時,最困難的可能就是如何定義比較算子了。
a、若是是基本數據類型,或已定義了比較運算符的類,能夠直接用STL 的less算子和greater算子—默認爲使用less 算子,即小的往前排,大的先出隊。
b、若是要定義本身的比較算子,方法有多種。這裏介紹其中的一種:重載比較運算符。
優先隊列試圖將兩個元素x 和y 代入比較運算符(對less 算子,調用x<y,對greater 算子,調用x>y),若結果爲真,則x 排在y 前面,y 將先於x 出隊,反之,則將y 排在x 前面,x 將先出隊。
#include <iostream> #include <queue> using namespace std; class T { public: int x, y, z; T(int a, int b, int c):x(a), y(b), z(c) { } }; bool operator < (const T &t1, const T &t2) { return t1.z < t2.z; // 按照z 的順序來決定t1 和t2 的順序 } main() { priority_queue<T> q; q.push(T(4,4,3)); q.push(T(2,2,5)); q.push(T(1,5,4)); q.push(T(3,3,6)); while (!q.empty()) { T t = q.top(); q.pop(); cout << t.x << " " << t.y << " " << t.z << endl; } return 1; } 輸出結果爲(注意是按照z 的順序從大到小出隊的): 3 3 6 2 2 5 1 5 4 4 4 3 再看一個按照z 的順序從小到大出隊的例子: #include <iostream> #include <queue> using namespace std; class T { public: int x, y, z; T(int a, int b, int c):x(a), y(b), z(c) { } }; bool operator > (const T &t1, const T &t2) { return t1.z > t2.z; } main() { priority_queue<T, vector<T>, greater<T> > q; q.push(T(4,4,3)); q.push(T(2,2,5)); q.push(T(1,5,4)); q.push(T(3,3,6)); while (!q.empty()) { T t = q.top(); q.pop(); cout << t.x << " " << t.y << " " << t.z << endl; } return 1; }
輸出結果爲:
4 4 3
1 5 4
2 2 5
3 3 6
若是咱們把第一個例子中的比較運算符重載爲:
bool operator < (const T &t1, const T &t2) { return t1.z > t2.z; // 按照z 的順序來決定t1 和t2 的順序 }
則第一個例子的程序會獲得和第二個例子的程序相同的輸出結果。