1. 栈的基本概念与STL实现
栈(Stack)是一种遵循"后进先出"(LIFO, Last In First Out)原则的线性数据结构。想象一下餐厅里叠放的盘子——你总是取走最上面的那个盘子,而新洗好的盘子也会被放在最上面。这种特性使得栈在解决特定类型的问题时非常高效。
C++标准模板库(STL)中的stack容器适配器为我们提供了现成的栈实现。与手动实现的栈相比,STL版本有几个显著优势:
- 自动内存管理:STL栈会自动处理内存分配和释放,开发者无需担心内存泄漏问题
- 类型安全:通过模板机制,可以创建存储任何数据类型的栈
- 高效实现:底层通常基于
deque或list实现,操作时间复杂度均为O(1) - 异常安全:提供了基本的异常保证,确保操作失败时程序状态的一致性
注意:虽然STL栈默认使用deque作为底层容器,但也可以通过第二个模板参数指定其他容器类型,如
stack<int, vector<int>>。不过在实际开发中,除非有特殊需求,否则建议使用默认实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STL栈的核心操作详解
2.1 栈的声明与初始化
创建一个STL栈非常简单,只需包含<stack>头文件并指定元素类型:
cpp复制#include <stack>
using namespace std;
stack<int> intStack; // 存储整数的栈
stack<string> strStack; // 存储字符串的栈
stack<double> dblStack; // 存储双精度浮点数的栈
在实际工程中,有几点需要注意:
- 类型一致性:栈中所有元素必须是同一类型,这是模板容器的基本要求
- 命名规范:建议使用有意义的名称,如
undoStack、callStack等,提高代码可读性 - 作用域管理:栈对象的作用域决定了其生命周期,全局栈和局部栈的使用场景不同
2.2 元素压栈(push操作)
push()操作用于向栈顶添加新元素:
cpp复制stack<int> s;
s.push(10); // 栈:[10]
s.push(20); // 栈:[20, 10]
s.push(30); // 栈:[30, 20, 10]
关于push操作有几个实用技巧:
-
批量压栈:可以使用循环结构批量添加元素
cpp复制for(int i = 1; i <= 5; ++i) { s.push(i * 10); } // 栈:[50, 40, 30, 20, 10] -
移动语义:C++11后支持移动语义,可以
