3分钟上手:终极小说下载工具,200+网站智能解析方案
2026/7/7 8:48:05
stack容器详解stack概述stack是C++标准模板库(STL)中的容器适配器,它提供后进先出(LIFO)的数据结构功能。stack不是独立的容器,而是基于其他容器(如deque、list)实现的适配器。
push和pop操作都是O(1)O(1)O(1)时间复杂度deque作为底层容器#include<stack>usingnamespacestd;stack<int>s1;// 默认基于deque的整型栈stack<string,list<string>>s2;// 基于list的字符串栈stack<double>s3(s1);// 拷贝构造stack<int>nums;// 创建空栈deque<int>dq={1,2,3};stack<int>s(dq);// 使用deque初始化栈stack<string,vector<string>>words;// 使用vector作为底层容器empty()if(s.empty()){cout<<"栈为空";}size()cout<<"栈大小: "<<s.size();top()if(!s.empty()){cout<<"栈顶元素: "<<s.top();}push()s.push(10);// 压入元素到栈顶s.push(20);s.push(30);emplace()s.emplace(40);// 在栈顶构造元素(避免拷贝)pop()if(!s.empty()){s.pop();// 移除栈顶元素(不返回)}swap()(C++11)stack<int>s2;s.swap(s2);// 交换两个栈的内容#include<iostream>#include<stack>#include<vector>usingnamespacestd;intmain(){// 创建基于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新栈内容: ";while(!s2.empty()){cout<<s2.top()<<" ";s2.pop();}cout<<endl;return0;}stack可以基于以下几种容器实现:
deque(默认):综合性能好,两端操作高效list:在任何位置插入删除都高效,但内存不连续vector:内存连续,但只在末尾操作高效// 基于不同容器的栈声明stack<int>s1;// 默认基于dequestack<int,list<int>>s2;// 基于liststack<int,vector<int>>s3;// 基于vectorboolisBalanced(conststring&expr){stack<char>s;for(charc:expr){if(c=='('||c=='['||c=='{'){s.push(c);}else{if(s.empty())returnfalse;chartop=s.top();s.pop();if((c==')'&&top!='(')||(c==']'&&top!='[')||(c=='}'&&top!='{')){returnfalse;}}}returns.empty();}intevaluatePostfix(conststring&exp){stack<int>s;for(charc:exp){if(isdigit(c)){s.push(c-'0');}else{intval1=s.top();s.pop();intval2=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;}}}returns.top();}时间复杂度:
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)(某些实现可能是O(n)O(n)O(n))空间复杂度:取决于底层容器实现
底层容器选择影响:
vector可能导致内存重新分配list有额外指针开销deque通常是平衡的选择top()或pop()前必须检查栈是否为空stack不提供迭代器,无法遍历栈内元素stack可能有细微的性能差异emplace()和swap()操作stack与其他容器比较| 特性 | stack | vector | deque |
|---|---|---|---|
| 访问方式 | 仅栈顶 | 随机访问 | 随机访问 |
| 插入/删除位置 | 仅顶端 | 主要末尾 | 两端 |
| 迭代器支持 | 不支持 | 支持 | 支持 |
| 内存布局 | 依赖底层容器 | 连续 | 分段连续 |