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

【C++指南】STL stack 完全解读(一):从入门到掌握基础操作

.

💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注
在这里插入图片描述

文章目录

    • 引言
    • 一、C++ STL stack全景解析
      • 1.1 容器适配器的本质
      • 1.2 核心价值剖析
    • 二、stack核心操作深度解读
      • 2.1 基础操作矩阵
      • 2.2 实战代码演练
        • 示例1:基础操作全流程
        • 示例2:经典括号匹配算法
    • 三、进阶应用场景
      • 3.1 表达式求值
      • 3.2 函数调用栈
      • 3.3 算法优化
    • 结语

引言

作为线性数据结构的经典代表,栈(stack)以其独特的后进先出(LIFO)特性,在函数调用、表达式求值、括号匹配等场景中扮演着关键角色。
在这里插入图片描述
在这里插入图片描述

本文将深入解析C++ STL中的stack容器适配器,通过理论讲解与实战代码演示,帮助读者掌握这一重要工具的使用精髓。
本篇不仅适合初窥门径的新手,也能为经验丰富的开发者提供新的视角。

关于栈的结构的详细介绍,可以参考我之前写的一篇用C语言手搓栈的讲解文章
👇
【数据结构与算法】使用数组实现栈:原理、步骤与应用

一、C++ STL stack全景解析

1.1 容器适配器的本质

stack并非独立的容器,而是构建于其他序列容器之上的容器适配器。默认情况下,它使用deque作为底层容器,这种设计使其具有以下显著特点:

template <class T, class Container = deque<T> > 
class stack;
  • 访问约束性:仅允许通过栈顶(top)进行元素操作
  • 操作高效性:所有操作的时间复杂度均为O(1)
  • 容器可置换性:支持替换底层容器为vectorlist

1.2 核心价值剖析

  1. 接口简洁性:通过有限的接口规范操作,避免误用
  2. 类型安全性:模板机制保证元素类型统一
  3. 内存安全性:自动管理内存生命周期
  4. 算法适配性:天然适合需要LIFO特性的算法场景

二、stack核心操作深度解读

2.1 基础操作矩阵

操作语法时间复杂度说明
压栈push(const T& val)O(1)添加元素到栈顶
弹栈pop()O(1)移除栈顶元素
访问栈顶top()O(1)返回栈顶元素的引用
判空检测empty()O(1)判断栈是否为空
容量查询size()O(1)返回当前元素数量

2.2 实战代码演练

示例1:基础操作全流程
#include <iostream>
#include <stack>int main() {std::stack<int> s;// 压栈操作s.push(10);  // 栈底 -> [10]s.push(20);  //        [10, 20]s.push(30);  // 栈顶 -> [10, 20, 30]// 访问栈顶std::cout << "Top element: " << s.top() << std::endl;  // 输出30// 弹栈操作s.pop();  // 移除30s.pop();  // 移除20// 判空检测if (!s.empty()) {std::cout << "Stack size: " << s.size() << std::endl;  // 输出1}return 0;
}
示例2:经典括号匹配算法
bool isBalanced(const std::string& expr) {std::stack<char> s;std::unordered_map<char, char> mapping = {{')', '('}, {']', '['}, {'}', '{'}};for (char ch : expr) {if (mapping.count(ch)) {if (s.empty() || s.top() != mapping[ch]) return false;s.pop();} else {s.push(ch);}}return s.empty();
}// 测试用例
std::cout << std::boolalpha;
std::cout << isBalanced("({[]})") << std::endl;  // 输出true
std::cout << isBalanced("([)]") << std::endl;    // 输出false

三、进阶应用场景

3.1 表达式求值

栈在处理中缀表达式转后缀表达式(逆波兰表示法)时表现卓越:

std::string infixToPostfix(const std::string& infix) {std::stack<char> op_stack;std::string postfix;// ... 转换逻辑(运算符优先级处理)return postfix;
}

关于逆波兰表达式的实践,单独写了一篇文章来讲解
【C++经典例题】逆波兰表达式求值:栈的经典应用与实现详解

3.2 函数调用栈

编译器使用调用栈管理函数调用关系:

void funcA() {funcB();  // 压入调用栈
}void funcB() {// 返回时自动弹栈
}

3.3 算法优化

在深度优先搜索(DFS)中,栈可替代递归实现:

void dfs(Node* root) {std::stack<Node*> s;s.push(root);while (!s.empty()) {Node* current = s.top();s.pop();// 处理节点for (auto child : current->children) {s.push(child);}}
}

结语

通过对STL stack的系统性学习,我们不仅掌握了其基本操作,更领略了其在算法设计中的精妙应用。然而,这仅仅是冰山一角——stack的真正魅力在于其精巧的底层实现。
在下一篇文章中,我们将揭开stack的神秘面纱,深入探讨其底层容器选择策略,并手把手指导实现自定义栈结构。届时,您将真正理解STL设计者的智慧结晶,并能够根据特定需求优化栈的实现。

下篇预告:《解剖STL stack:从底层实现到自定义栈设计》——深入STL源码,解析deque的适配机制,并实现支持动态扩容的安全栈结构。

http://www.dtcms.com/a/314531.html

相关文章:

  • 【C#】操作Execl和Word文件-2
  • 深入理解基础 IO:从 C 库函数到系统调用的全景指南
  • MCP安全机制深度剖析:权限控制与数据保护最佳实践
  • 液体泄漏识别误报率↓75%:陌讯多模态融合算法实战解析
  • vllm启动Qwen/Qwen3-Coder-30B-A3B-Instruct并支持工具调用
  • vue3 elementPlus el-dialog添加拖拽
  • Python实现Word转PDF全攻略:从入门到实战
  • 【人工智能99问】什么是Post-Training,包含哪些内容?(19/99)
  • 机器学习(12):拉索回归Lasso
  • 墨者学院SQL过滤字符后手工绕过漏洞测试(万能口令)
  • 【2025/08/04】GitHub 今日热门项目
  • vue3+vue-flow制作简单可拖拽可增删改流程图
  • 基于Matlab图像处理的液晶显示器表面缺陷检测与分类研究
  • 使用 SecureCRT 连接华为 eNSP 模拟器的方法
  • 【测试】⽤例篇
  • Android Telephony 框架与横向支撑层
  • SpringBoot+SpringMVC常用注解
  • 多线程(线程的创建与常见方法的使用)
  • sqli-labs靶场less29~less35
  • milvus client操作简单示例
  • 数据与模型优化随机森林回归进行天气预测
  • PyTorch深度学习实战(48)——基于Transformer实现机器翻译
  • 1.kotlin数组、集合常用方法
  • Day31:文件的规范拆分与写法
  • 三维模型轻量化双杀技:GISBox的纹理压缩与顶点压缩联合
  • 交叉验证:原理、作用与在机器学习流程中的位置
  • 【笔记】ROS1|1 ROS基本命令介绍及创建工作空间与功能包【旧文转载】
  • 从知识管理到智能协作:Gitee Wiki如何重塑软件研发效率范式
  • AI聊天:虚拟主播的角色提示词
  • HTTPS有哪些优点