news 2026/3/10 23:54:10

C++从入门到实战(二十二)stack的介绍和使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++从入门到实战(二十二)stack的介绍和使用

C++从入门到实战(二十二)stack的介绍和使用

  • 前言
  • 一、什么是stack
    • 1.1 stack的核心特性
    • 1.2 stack与序列容器的核心差异
  • 二、stack的核心接口详解
    • 2.1 构造函数:stack()
    • 2.2 判空操作:empty()
    • 2.3 大小获取:size()
    • 2.4 栈顶访问:top()
    • 2.5 入栈操作:push()
    • 2.6 出栈操作:pop()
  • 三、stack的综合使用示例
  • 四、stack核心接口总结

前言

  • 在前几篇博客中,我们系统学习了vector(动态数组)、list(双向循环链表)、string(动态字符串)等序列式容器——它们都支持随机访问或双向遍历,可直接操作任意位置的元素。
  • 本篇将聚焦STL中的适配器容器——stack(栈):它并非独立的容器,而是基于其他序列容器(如dequevector)封装而成的“适配容器”,核心遵循后进先出(LIFO)原则,仅支持栈顶的插入、删除和访问操作。
  • 我们将从stack的核心特性入手,详解其常用接口的用法、底层实现逻辑,并结合示例说明其典型应用场景,帮助你掌握栈的核心使用技巧。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482


C++官方stack文档
https://cplusplus.com/reference/stack/stack/

一、什么是stack

std::stack是C++ STL中的容器适配器(Container Adapter),而非原生容器——它封装了底层序列容器(默认是deque双端队列(后续我们也会详细讲解)),并仅暴露符合“栈”特性的接口,核心规则是:最后入栈的元素最先出栈(LIFO, Last In First Out)

1.1 stack的核心特性

  • 单向操作:仅能对栈顶进行插入(push)、删除(pop)和访问(top)操作,无法访问栈中间或栈底的元素。
  • 无随机访问:不支持下标([])、迭代器遍历,也没有begin()/end()接口。
  • 适配器特性:底层可复用dequevectorlist等序列容器(需满足back()push_back()pop_back()empty()size()接口),默认选择deque(兼顾效率和内存特性)。
  • 轻量级封装stack本身仅提供接口封装,无额外内存开销,性能依赖底层容器。

1.2 stack与序列容器的核心差异

对比维度stack(栈)vector(动态数组)list(双向链表)
访问方式仅栈顶(top()随机访问([]/at()双向遍历(迭代器)
插入/删除位置仅栈顶(push()/pop()任意位置(insert()/erase()任意位置(insert()/erase()
迭代器支持不支持支持随机访问迭代器支持双向迭代器
底层实现容器适配器(默认deque连续内存离散节点(双向循环链表)
核心规则后进先出(LIFO)顺序存储顺序存储

二、stack的核心接口详解

stack的接口极简,仅包含构造、判空、大小、栈顶访问、入栈、出栈6个核心接口,以下是详细说明:

2.1 构造函数:stack()

语法

stack<T>st;// T为存储的元素类型(如int、string等)// 或指定底层容器:stack<T, Container> st;

作用

  • 创建一个空的栈,底层容器默认初始化(如deque的默认构造)。

示例

#include<stack>#include<iostream>#include<vector>#include<list>usingnamespacestd;intmain(){// 1. 默认构造(底层deque)stack<int>st1;// 2. 指定底层容器为vectorstack<int,vector<int>>st2;// 3. 指定底层容器为liststack<int,list<int>>st3;cout<<"st1是否为空:"<<st1.empty()<<endl;// 输出:1(true)return0;}

2.2 判空操作:empty()

语法

boolempty()const;

作用

  • 检测栈是否为空(无元素),为空返回true,否则返回false

示例

stack<int>st;cout<<st.empty()<<endl;// 空栈,输出:1(true)st.push(10);cout<<st.empty()<<endl;// 非空,输出:0(false)

2.3 大小获取:size()

语法

size_tsize()const;

作用

  • 返回栈中元素的个数,类型为size_t(无符号整数)。

示例

stack<int>st;st.push(1);st.push(2);st.push(3);cout<<"栈的大小:"<<st.size()<<endl;// 输出:3

2.4 栈顶访问:top()

语法

// 普通版本:返回栈顶元素的引用(可修改)T&top();// const版本:返回栈顶元素的const引用(只读)constT&top()const;

作用

  • 返回栈顶元素的引用(栈顶是最后入栈的元素),注意:空栈调用top()会导致未定义行为

示例

stack<int>st;st.push(10);st.push(20);// 普通版本:修改栈顶元素st.top()=30;cout<<"栈顶元素:"<<st.top()<<endl;// 输出:30// const版本:只读conststack<int>cst(st);cout<<"const栈顶元素:"<<cst.top()<<endl;// 输出:30// cst.top() = 40; // 错误!const引用不可修改


2.5 入栈操作:push()

语法

// 拷贝入栈:将val拷贝到栈顶voidpush(constT&val);// 移动入栈(C++11):将val移动到栈顶(效率更高)voidpush(T&&val);// 原地构造(C++11):直接在栈顶构造元素,避免拷贝template<class...Args>voidemplace(Args&&...args);

作用

  • 将元素添加到栈顶,底层调用容器的push_back()(或emplace_back())。

示例

stack<int>st;// 普通拷贝入栈st.push(1);st.push(2);// emplace原地构造(效果同push(3),但效率更高)st.emplace(3);cout<<"栈顶元素:"<<st.top()<<endl;// 输出:3cout<<"栈的大小:"<<st.size()<<endl;// 输出:3

2.6 出栈操作:pop()

语法

voidpop();

作用
删除栈顶元素(仅删除,不返回),底层调用容器的pop_back();注意:空栈调用pop()会导致未定义行为

示例

stack<int>st;st.push(1);st.push(2);st.push(3);cout<<"出栈前栈顶:"<<st.top()<<endl;// 输出:3st.pop();// 删除栈顶元素3cout<<"出栈后栈顶:"<<st.top()<<endl;// 输出:2cout<<"出栈后大小:"<<st.size()<<endl;// 输出:2

三、stack的综合使用示例

stack的核心操作是“入栈→访问栈顶→出栈”的循环,以下是完整示例,包含栈的基本操作和“遍历”技巧(stack无迭代器,需借助临时栈):

#include<stack>#include<iostream>usingnamespacestd;intmain(){// 1. 初始化栈并入栈元素stack<int>st;st.push(10);st.push(20);st.push(30);st.push(40);// 2. 基本属性cout<<"栈是否为空:"<<st.empty()<<endl;// 输出:0cout<<"栈的大小:"<<st.size()<<endl;// 输出:4cout<<"栈顶元素:"<<st.top()<<endl;// 输出:40// 3. 出栈操作(删除栈顶)st.pop();cout<<"出栈后栈顶:"<<st.top()<<endl;// 输出:30// 4. 模拟遍历栈(需借助临时栈,遍历后原栈为空)stack<int>temp;// 临时栈cout<<"栈的元素(从栈顶到栈底):";while(!st.empty()){intval=st.top();cout<<val<<" ";// 输出:30 20 10temp.push(val);// 保存到临时栈st.pop();// 原栈出栈}cout<<endl;// 5. 恢复原栈(从临时栈倒回)while(!temp.empty()){st.push(temp.top());temp.pop();}cout<<"恢复后栈的大小:"<<st.size()<<endl;// 输出:3return0;}

输出结果

四、stack核心接口总结

接口名语法功能描述注意事项
构造stack<T> st;创建空栈,默认底层容器为deque可指定底层容器(如vector/list)
empty()bool empty() const;判断栈是否为空,空返回true无参数,时间复杂度O(1)
size()size_t size() const;返回栈中元素个数返回值为无符号整数
top()T& top();返回栈顶元素的引用(可修改)空栈调用会导致未定义行为
push()void push(const T& val);将val拷贝入栈顶底层调用push_back()
emplace()void emplace(Args&&... args);栈顶原地构造元素C++11新增,效率高于push()
pop()void pop();删除栈顶元素(无返回值)空栈调用会导致未定义行为

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/8 6:55:29

双十二投影仪哪款值得推荐?这4个价位段最值得买的一款

双十二大促是2025年入手投影仪最后的黄金窗口期。面对琳琅满目的产品&#xff0c;如何根据自身需求和预算快速锁定最佳选择&#xff1f;本文直接从预算与场景入手&#xff0c;为大家带来覆盖全价位段的四款高性价比投影仪&#xff0c;从便携入门到专业影院级&#xff0c;一步到…

作者头像 李华
网站建设 2026/3/10 4:27:15

常用接口抓包以及接口测试工具总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口统称为API&#xff0c;程序与程序之间的对接、交接。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;主要是为了检验不…

作者头像 李华
网站建设 2026/3/5 21:57:49

练题100天——DAY29:岛屿的周长+寻找两个正序数组的中位数

今天的两道题都是有点硬的骨头&#xff0c;勉勉强强能做出来&#xff0c;但是想不到特定的解决方法&#xff0c;算法难度★★★★。深度优先算法和二分查找以为自己会&#xff0c;遇到这两道题算是给了我当头两棒&#xff1a;根本不知道何时用、怎么用深度优先算法&#xff0c;…

作者头像 李华
网站建设 2026/3/4 3:18:01

EtherCAT 转 Modbus RTU 网关:实现倍福 PLC 与宇电 AI-516 温控器协同联动

一、项目背景 某精密机械制造企业的数控加工生产线面临异构设备通信难题&#xff1a;生产线核心控制采用倍福 CX5140 PLC&#xff08;支持 EtherCAT 协议&#xff09;&#xff0c;负责主轴运转、工序联动及整体流程控制&#xff0c;而现场 18 台数控加工机床的温度调控依赖宇电…

作者头像 李华
网站建设 2026/3/4 12:34:03

平台生态:生成式AI的差异化规则与适配策略

主流AI平台的生态特征不同生成式AI平台基于其训练数据、技术架构和商业策略&#xff0c;形成了各具特色的“生态偏好”。理解这些差异是制定有效GEO策略的前提。OpenAI的ChatGPT表现出对权威来源和近期内容的明显偏好。研究显示&#xff0c;ChatGPT在回答事实性问题时&#xff…

作者头像 李华