C++ Primer 學習筆記_11_標準模板庫_stack、queue隊列容器與priority_queue優先隊列容器,_11_stack

來源:互聯網
上載者:User

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


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.