当前位置: 首页 > news >正文

C++中的stack容器详解

C++中的stack容器详解

1.stack概述

stack是C++标准模板库(STL)中的容器适配器,它提供后进先出(LIFO)的数据结构功能。stack不是独立的容器,而是基于其他容器(如dequelist)实现的适配器。

2. 基本特性

  • 后进先出(LIFO):最后压入的元素最先弹出
  • 容器适配器:基于其他序列容器实现
  • 限制访问:只允许访问栈顶元素
  • 高效操作pushpop操作都是O(1)O(1)O(1)时间复杂度
  • 默认实现:默认使用deque作为底层容器

3. 头文件与声明

#include<stack>usingnamespacestd;stack<int>s1;// 默认基于deque的整型栈stack<string,list<string>>s2;// 基于list的字符串栈stack<double>s3(s1);// 拷贝构造

4. 构造函数与初始化

4.1 默认构造

stack<int>nums;// 创建空栈

4.2 基于其他容器构造

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);// 在栈顶构造元素(避免拷贝)

7.3pop()

if(!s.empty()){s.pop();// 移除栈顶元素(不返回)}

7.4swap()(C++11)

stack<int>s2;s.swap(s2);// 交换两个栈的内容

8. 完整示例

#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;}

9. 底层容器选择

stack可以基于以下几种容器实现:

  1. deque(默认):综合性能好,两端操作高效
  2. list:在任何位置插入删除都高效,但内存不连续
  3. vector:内存连续,但只在末尾操作高效
// 基于不同容器的栈声明stack<int>s1;// 默认基于dequestack<int,list<int>>s2;// 基于liststack<int,vector<int>>s3;// 基于vector

10. 实际应用示例

10.1 括号匹配检查

boolisBalanced(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();}

10.2 表达式求值(后缀表达式)

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();}

11. 性能考虑

  1. 时间复杂度

    • 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))
  2. 空间复杂度:取决于底层容器实现

  3. 底层容器选择影响

    • vector可能导致内存重新分配
    • list有额外指针开销
    • deque通常是平衡的选择

12. 注意事项

  1. 调用top()pop()前必须检查栈是否为空
  2. stack不提供迭代器,无法遍历栈内元素
  3. 不同底层容器实现的stack可能有细微的性能差异
  4. C++11开始支持emplace()swap()操作

13.stack与其他容器比较

特性stackvectordeque
访问方式仅栈顶随机访问随机访问
插入/删除位置仅顶端主要末尾两端
迭代器支持不支持支持支持
内存布局依赖底层容器连续分段连续
http://www.jsqmd.com/news/368757/

相关文章:

  • 8款AI降AIGC工具,赶due应急超实用!
  • C++中的unordered_multimap容器详解
  • 实测6款AI降AIGC率工具,付费版更优
  • 2026年消防救援应急演练厂家最新推荐:自然灾害应急演练、交通事故应急演练公司、公共卫生事件应急演练选择指南 - 优质品牌商家
  • 对比6款AI降AIGC工具,免费款易踩坑
  • 6款AI降AIGC率网站测评,付费更稳定
  • AI降AIGC工具6款对比,免费功能受限
  • 例说FPGA:可直接用于工程项目的第一手经验【3.7】
  • 2026外墙装饰设计必备:台州仿石材,热转印木纹厂家、别墅外墙装饰、冲孔雕花厂家哪家好?热门的幕墙铝单板哪家好、源头厂家 - 栗子测评
  • 2026年如东橱柜定制厂家权威推荐榜:泰州全屋定制/泰州橱柜定制/泰州装修设计/海安全屋定制/海安橱柜定制/选择指南 - 优质品牌商家
  • 2026年34crni3mo圆钢厂家最新推荐:FF710圆钢/40CRNI2si2mov圆钢/选择指南 - 优质品牌商家
  • Midjourney 绘图下面的 u和v 什么意思?一文看懂详细参数!
  • 2026年5crmnmo圆钢厂家最新推荐:40CRNI2si2mov圆钢/50crv圆钢/FF710圆钢/选择指南 - 优质品牌商家
  • 2026步进电机榜选型干货:广东新力川步进电机公司好不好?热门的步进电机品牌厂家、定制厂家、批发厂家全盘点 - 栗子测评
  • 2026乐山特色小吃优质门店推荐榜新鲜正宗豆腐脑精选 - 优质品牌商家
  • 2026年智慧养老院系统厂家推荐:养老院软件系统/智慧养老平台/智慧养老服务/智慧养老系统/养老管理系统/选择指南 - 优质品牌商家
  • uni-app——uni-app 小程序弹窗意外关闭的事件冒泡问题
  • 读人工智能全球格局:未来趋势与中国位势01重新理解人工智能
  • 2026乐山油炸串串优质推荐榜 聚焦脆皮口感 - 优质品牌商家
  • 2026权威伺服电机品牌榜:广东伺服电机公司,性价比高质量好品牌有哪些?新力川的伺服电机好不好?伺服电机品牌定制厂家、批 - 栗子测评
  • 对某些应用场景,OpenClaw表现不如CLI的原因分析
  • 在无备份的本地电脑上用OpenClaw是有危险性的
  • 乐山优质临江鳝丝店品牌推荐榜 - 优质品牌商家
  • MySQL 死锁排查实战:从“Killed”状态到“ROLLING BACK”的深度解析
  • 2026年江苏比较好的IAR软件代理商选购选型手册 - 品牌鉴赏师
  • 2026年养老院系统公司权威推荐:养老院护理系统/养老院智能化/养老院软件系统/智慧养老平台/智慧养老服务/选择指南 - 优质品牌商家
  • 2026年中山市专业会所装修公司厂家最新推荐:中山园林景观装修公司、中山市专业厂房装修公司、中山市专业酒楼装修选择指南 - 优质品牌商家
  • 2026年有实力的基层公卫AI健康管理,中医馆AI健康管理公司选购参考榜 - 品牌鉴赏师
  • 2026年中山市专业办公楼装修公司厂家权威推荐榜:中山老牌工装公司/中山办公大楼工装公司/中山厂房工装公司/选择指南 - 优质品牌商家
  • 2026工业检测必看:大样品原子力显微镜厂家怎么选?工业原子力显微镜哪家好?原子力显微镜厂家实力对比与靠谱推荐全解析 - 栗子测评