C++ Primer 學習筆記_11_標準模板庫_stack、queue隊列容器與priority_queue優先隊列容器,_11_stack
C++ Primer 學習筆記_11_標準模板庫_stack、queue隊列容器與priority_queue優先隊列容器
1、stack堆棧
stack堆棧是一個後進先出(Last In First Out,LIFO)的線性表,插入和刪除元素都只能在表的一端進行。插入元素的一端稱為棧頂,而另一端稱為棧底。插入元素叫入棧(Push),刪除元素叫出棧(Pop)。是堆棧
堆棧只提供入棧,出棧,棧頂元素訪問和判斷是否為空白等幾種方法。採用push()方法將元素入棧;採用pop()方法出棧;採用top()方法訪問棧頂元素;採用empty()方法判斷堆棧是否為空白,如果是空,返回true,否則,返回false。另外,可以採用size()方法返回當前堆棧有幾個元素。
#include <iostream>#include <stack> using namespace std; int main(int argc, char* argv[]){ stack<int> s; s.push(1); s.push(2); s.push(3); s.push(9); cout << "棧頂元素為:" << s.top() << endl; cout << "堆棧元素數量:" << s.size() << endl; while(s.empty() != true) { cout << "棧頂元素為:" << s.top() << endl; s.pop(); //出棧 } if(s.empty()) cout << "empty" << endl; return 0;}
運行結果:
棧頂元素為:9
堆棧元素數量:4
棧頂元素為:9
棧頂元素為:3
棧頂元素為:2
棧頂元素為:1
empty
2、隊列容器queue
隊列容器queue是一個先進先出(FirstIn First Out,FIFO)的線性儲存表,元素的插入只能在隊尾,元素的刪除只能在隊首。圖2-10是queue隊列容器資料結構。
queue隊列具有入隊push()、出隊pop()、讀取隊首元素front()、讀取隊尾元素back()、判斷隊列是否為空白empty()和隊列當前元素的數目size()幾種方法。
#include <iostream>#include <queue> using namespace std; int main(int argc, char* argv[]){ queue<int> num; num.push(1); num.push(2); num.push(3); num.push(9); cout << num.size() << endl; cout << num.empty() << endl; cout << num.front() << endl; cout << num.back() << endl; while(!num.empty()) { cout << num.front() << " "; num.pop(); } cout << endl; return 0;}
運行結果:
4
0
1
9
1 2 3 9
3、優先隊列容器priority_queue
優先隊列容器priority_queue與隊列一樣,只能從隊尾插入元素,從隊首刪除元素。但它有一個特性,就是隊列中最大的元素總是位於隊首,所以出隊時,並非按先進先出的原則進行,而是將當前隊列中最大的元素出隊。這點類似於給隊列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素的值由大到小排序;當然,可以重載“<”操作符來重新定義比較規則。也可以重載“()”重新定義比較規則。
聲明的標頭檔也為#include<queue>。
3.1 優先隊列的使用方法
優先隊列包含入隊push()、出隊pop()、讀取隊首元素top()、判斷隊列是否為空白empty()和隊列當前元素的數目size()幾種方法。
#include <iostream>#include <queue> using namespace std; int main(int argc, char* argv[]){ priority_queue<int> num; num.push(1); num.push(2); num.push(3); num.push(9); cout << num.size() << endl; cout << num.empty() << endl; cout << num.top() << endl; while(!num.empty()) { cout << num.top() << " "; num.pop(); } cout << endl; return 0;}
運行結果:
4
0
9
9 3 2 1
3.2 重載“<”操作符來定義優先順序
如果優先隊列的元素類型是結構體,可以通過在結構體中重載“<”操作符的方法來修改優先隊列的優先順序。
#include <iostream>#include <queue>#include <string> using namespace std; struct Info{ string name; float score; bool operator < (const Info &a) const { return a.score < score; }}; int main(int argc, char* argv[]){ priority_queue<Info> student; Info info; info.name = "Jack"; info.score = 68.5; student.push(info); info.name = "Bomi"; info.score = 18.5; student.push(info); info.name = "Peti"; info.score = 90; student.push(info); while(!student.empty()) { cout << student.top().name << " : " <<student.top().score << endl; student.pop(); } return 0;}
運行結果:
Bomi : 18.5
Jack : 68.5
Peti : 90
3.3 重載“()”操作符來定義優先順序
如果優先隊列的元素不是結構體類型,則可以通過重載“()”操作符的方式來定義優先順序。當然,元素是結構體類型,也可以通過重載“()”操作符的方式來定義優先順序,而不一定要在結構體內重載“<”操作符才行。
#include <iostream>#include <queue>#include <vector> using namespace std; struct myComp{ booloperator () (const int &a, const int &b) { return a > b; }}; int main(int argc, char* argv[]){ //定義優先隊列,元素類型為myComp,顯式說明內部結構式vector priority_queue<int, vector<int>, myComp> num; num.push(1); num.push(9); num.push(2); num.push(30); while(!num.empty()) { cout << num.top() << " "; num.pop(); } cout << endl; return 0;}
運行結果;
1 2 9 30
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。