? 堅持用 清晰易懂的圖解 + 代碼語言, 讓每個知識點都 簡單直觀 !
🚀 個人主頁 :不呆頭 · CSDN
🌱 代碼倉庫 :不呆頭 · Gitee
📌 專欄系列 :
- 📖 《C語言》
- 🧩 《數據結構》
- 💡 《C++》
- 🐧 《Linux》
💬 座右銘 : “不患無位,患所以立。”
【C++】STL詳解(七)—stack和queue的介紹及使用
- 前言
- 目錄
- 一、stack
- 1. stack的介紹
- 2. stack的定義方式
- 2.1 使用默認的適配器定義棧
- 2.2 方式二:使用特定的適配器定義棧
- 3.stack的使用
- 二、queue
- 1. queue的介紹
- 2. queue的定義方式
- 2.1 使用默認的適配器定義隊列
- 2.2 使用特定的適配器定義隊列
- 3.queue的使用
- 三、總結
前言
🚀 歡迎來到《C++修煉之路》!
這里是C++程序員的成長樂園,帶你領略從面向對象到現代C++的精彩世界。我們將>用簡潔的代碼和生動的案例,助你掌握C++核心精髓。
🔍 專欄亮點:
- 現代C++特性解析(C++11/14/17)
- STL源碼剖析與實戰應用
- 內存管理與性能優化技巧
💡 收獲預期:
?? 寫出更健壯的C++代碼
?? 深入理解面向對象設計
?? 掌握模板編程基礎📌 編程箴言:
“好的C++代碼就像好酒,需要時間沉淀。”
(正文開始👇)
目錄
一、stack
1. stack的介紹
C++98中
stack
的構造函數explicit stack(const container_type& ctnr = container_type())
表示:stack
是一個容器適配器,內部需要一個底層容器(默認是deque<T>
)來存儲元素;如果不傳參數,就會默認構造一個空的底層容器來初始化空棧;如果傳入一個已有容器,就會以該容器的內容來初始化棧,且棧頂對應容器的最后一個元素。這里的explicit
關鍵字用來禁止隱式轉換,也就是說不能直接用一個容器賦值給stack
,必須顯式構造。專門用于具有后進先出的上下文環境中,其只能從元素的一端進行插入和提取操作。
2. stack的定義方式
2.1 使用默認的適配器定義棧
stack<int> st1;
注意: 如果沒有為stack指定特定的底層容器,默認情況下使用deque。
2.2 方式二:使用特定的適配器定義棧
stack<int, vector<int>> st2;
stack<int, list<int>> st3;
3.stack的使用
stack 常用函數速查表
函數 | 功能說明 | 示例 |
---|---|---|
push(const T& x) | 元素入棧(放到棧頂) | s.push(10); |
pop() | 刪除棧頂元素(不返回值) | s.pop(); |
top() | 訪問棧頂元素(返回引用) | int x = s.top(); |
empty() | 判斷棧是否為空,空返回 true | if(s.empty()) ... |
size() | 返回棧中元素個數 | cout << s.size(); |
swap(stack& other) | 與另一棧交換內容 | s1.swap(s2); |
stack
沒有提供遍歷迭代器,也沒有隨機訪問功能。- 想查看所有元素,只能不斷
pop()
出來。
#include<iostream>
#include<vector>
#include<stack>
using namespace std;int main()
{stack<int, vector<int>> st;stack<int, vector<int>> st1;st.push(5);st.push(2);st.push(0);st.push(2);st.push(0);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;st1.push(6);st1.push(6);st1.push(6);st.swap(st1);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;return 0;
}
測試結果:
二、queue
1. queue的介紹
queue
的構造函數explicit queue(const container_type& ctnr = container_type())
表示:queue
作為容器適配器,內部需要一個底層順序容器(默認是deque<T>
)來完成先進先出的隊列操作;如果不傳參數,就默認用一個空的底層容器初始化一個空隊列;如果傳入一個已有容器,就會用該容器的內容來初始化隊列,其中隊首對應底層容器的第一個元素,隊尾對應最后一個元素;而explicit
關鍵字則用于禁止隱式轉換,只能顯式地通過容器構造queue
,不能直接賦值轉換。專門用在具有先進先出操作的上下文環境中,其只能從容器的一端插入元素,另一端提取元素。
2. queue的定義方式
2.1 使用默認的適配器定義隊列
queue<int> qu;
注意: 如果沒有為queue指定特定的底層容器,默認情況下使用deque。
2.2 使用特定的適配器定義隊列
queue<int,vector<int>> qu1;
queue<int,list<int>> qu2;
3.queue的使用
queue 常用函數速查表
函數 | 功能說明 | 示例 |
---|---|---|
push(const T& x) | 元素入隊(放到隊尾) | q.push(10); |
pop() | 刪除隊首元素(不返回值) | q.pop(); |
front() | 訪問隊首元素(返回引用) | int x = q.front(); |
back() | 訪問隊尾元素(返回引用) | int y = q.back(); |
empty() | 判斷隊列是否為空,空返回 true | if(q.empty()) ... |
size() | 返回隊列中元素個數 | cout << q.size(); |
swap(queue& other) | 與另一隊列交換內容 | q1.swap(q2); |
queue
沒有提供迭代器和隨機訪問功能。- 想遍歷所有元素,需要不斷
pop()
出隊。
#include<iostream>
#include<queue>
#include<list>
using namespace std;int main()
{queue<int, list<int>> qu;queue<int, list<int>> qu1;qu.push(5);qu.push(2);qu.push(0);qu.push(2);qu.push(0);cout << qu.size() << endl;while (!qu.empty()){cout << qu.front() << " ";qu.pop();}cout << endl;qu1.push(6);qu1.push(6);qu1.push(6);qu.swap(qu1);while (!qu.empty()){cout << qu.front() << " ";qu.pop();}cout << endl;return 0;
}
三、總結
不是呆頭梳理了 stack 與 queue 的構造方式、常用函數以及典型用法:stack
主打 后進先出(LIFO),適合用在函數調用、表達式求值等場景;queue
主打 先進先出(FIFO),常用于任務調度、消息傳遞等場合。它們雖然功能簡單,但在實際開發中卻是高效而常用的工具。掌握好這兩個適配器容器,不僅能幫我們寫出更清晰的邏輯結構,也能為后續深入理解 STL 更復雜的容器與算法 打下堅實基礎。
不是呆頭將一直堅持用清晰易懂的圖解 + 代碼語言,讓每個知識點變得簡單!
👁? 【關注】 看一個非典型程序員如何用野路子解決正經問題
👍 【點贊】 給“不寫八股文”的技術分享一點鼓勵
🔖 【收藏】 把這些“奇怪但有用”的代碼技巧打包帶走
💬 【評論】 來聊聊——你遇到過最“呆頭”的 Bug 是啥?
🗳? 【投票】 您的投票是支持我前行的動力
技術沒有標準答案,讓我們一起用最有趣的方式,寫出最靠譜的代碼! 🎮💻