C++中的stack容器操作大全
1.stack概述
stack是C++標(biāo)準(zhǔn)模板庫(STL)中的容器適配器,它提供后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)功能。stack不是獨(dú)立的容器,而是基于其他容器(如deque、list)實(shí)現(xiàn)的適配器。
2. 基本特性
- 后進(jìn)先出(LIFO):最后壓入的元素最先彈出
- 容器適配器:基于其他序列容器實(shí)現(xiàn)
- 限制訪問:只允許訪問棧頂元素
- 高效操作:
push和pop操作都是O(1)O(1)O(1)時(shí)間復(fù)雜度 - 默認(rèn)實(shí)現(xiàn):默認(rèn)使用
deque作為底層容器
3. 頭文件與聲明
#include <stack> using namespace std; stack<int> s1; // 默認(rèn)基于deque的整型棧 stack<string, list<string>> s2; // 基于list的字符串棧 stack<double> s3(s1); // 拷貝構(gòu)造
4. 構(gòu)造函數(shù)與初始化
4.1 默認(rèn)構(gòu)造
stack<int> nums; // 創(chuàng)建空棧
4.2 基于其他容器構(gòu)造
deque<int> dq = {1, 2, 3};
stack<int> s(dq); // 使用deque初始化棧
4.3 指定底層容器類型
stack<string, vector<string>> words; // 使用vector作為底層容器
5. 容量操作
5.1empty()
if (s.empty()) {
cout << "棧為空";
}
5.2size()
cout << "棧大小: " << s.size();
6. 元素訪問
6.1top()
if (!s.empty()) {
cout << "棧頂元素: " << s.top();
}
7. 修改操作
7.1push()
s.push(10); // 壓入元素到棧頂 s.push(20); s.push(30);
7.2emplace()
s.emplace(40); // 在棧頂構(gòu)造元素(避免拷貝)
7.3pop()
if (!s.empty()) {
s.pop(); // 移除棧頂元素(不返回)
}
7.4swap()(C++11)
stack<int> s2; s.swap(s2); // 交換兩個(gè)棧的內(nèi)容
8. 完整示例
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
// 創(chuàng)建基于vector的棧
stack<int, vector<int>> s;
// 壓入元素
s.push(10);
s.push(20);
s.emplace(30); // 等同于push但效率更高
// 查看棧信息
cout << "棧大小: " << s.size() << endl;
cout << "棧頂元素: " << s.top() << endl;
// 彈出元素
cout << "\n彈出元素: ";
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}
cout << endl;
// 檢查棧是否為空
cout << "棧是否為空: " << (s.empty() ? "是" : "否") << endl;
// 使用其他容器初始化棧
vector<int> v = {1, 2, 3, 4, 5};
stack<int, vector<int>> s2(v);
cout << "\n新棧內(nèi)容: ";
while (!s2.empty()) {
cout << s2.top() << " ";
s2.pop();
}
cout << endl;
return 0;
}9. 底層容器選擇
stack可以基于以下幾種容器實(shí)現(xiàn):
deque(默認(rèn)):綜合性能好,兩端操作高效list:在任何位置插入刪除都高效,但內(nèi)存不連續(xù)vector:內(nèi)存連續(xù),但只在末尾操作高效
// 基于不同容器的棧聲明 stack<int> s1; // 默認(rèn)基于deque stack<int, list<int>> s2; // 基于list stack<int, vector<int>> s3; // 基于vector
10. 實(shí)際應(yīng)用示例
10.1 括號(hào)匹配檢查
bool isBalanced(const string& expr) {
stack<char> s;
for (char c : expr) {
if (c == '(' || c == '[' || c == '{') {
s.push(c);
} else {
if (s.empty()) return false;
char top = s.top();
s.pop();
if ((c == ')' && top != '(') ||
(c == ']' && top != '[') ||
(c == '}' && top != '{')) {
return false;
}
}
}
return s.empty();
}10.2 表達(dá)式求值(后綴表達(dá)式)
int evaluatePostfix(const string& exp) {
stack<int> s;
for (char c : exp) {
if (isdigit(c)) {
s.push(c - '0');
} else {
int val1 = s.top(); s.pop();
int val2 = s.top(); s.pop();
switch (c) {
case '+': s.push(val2 + val1); break;
case '-': s.push(val2 - val1); break;
case '*': s.push(val2 * val1); break;
case '/': s.push(val2 / val1); break;
}
}
}
return s.top();
}11. 性能考慮
時(shí)間復(fù)雜度:
push(): O(1)O(1)O(1)pop(): O(1)O(1)O(1)top(): O(1)O(1)O(1)empty(): O(1)O(1)O(1)size(): O(1)O(1)O(1) (某些實(shí)現(xiàn)可能是O(n)O(n)O(n))
空間復(fù)雜度:取決于底層容器實(shí)現(xiàn)
底層容器選擇影響:
vector可能導(dǎo)致內(nèi)存重新分配list有額外指針開銷deque通常是平衡的選擇
12. 注意事項(xiàng)
- 調(diào)用
top()或pop()前必須檢查棧是否為空 stack不提供迭代器,無法遍歷棧內(nèi)元素- 不同底層容器實(shí)現(xiàn)的
stack可能有細(xì)微的性能差異 - C++11開始支持
emplace()和swap()操作
13.stack與其他容器比較
| 特性 | stack | vector | deque |
|---|---|---|---|
| 訪問方式 | 僅棧頂 | 隨機(jī)訪問 | 隨機(jī)訪問 |
| 插入/刪除位置 | 僅頂端 | 主要末尾 | 兩端 |
| 迭代器支持 | 不支持 | 支持 | 支持 |
| 內(nèi)存布局 | 依賴底層容器 | 連續(xù) | 分段連續(xù) |
到此這篇關(guān)于C++中的stack容器操作大全的文章就介紹到這了,更多相關(guān)C++ stack容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解C語言中的switch語句和while循環(huán)
這篇文章主要給大家詳細(xì)介紹了C語言中的switch語句和while循環(huán),文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12
C語言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生選課系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

