C++ STL stack容器使用详解

一、stack容器概述

stack容器适配器是C++标准模板库(STL)中实现后进先出 (LIFO)数据结构的重要组件,它通过封装底层容器(如deque/vector/list)提供栈操作接口。

二、stack核心操作详解

1. 容器构造方式

cpp 复制代码
// 默认使用deque存储元素
stack<int> staInt;  

// 显式指定底层容器
stack<int, vector<int>> vecStack;
stack<int, list<int>> listStack;
stack<int, deque<int>> dequeStack;
  • deque:默认底层容器,支持快速首尾操作
  • vector :需要包含头文件<vector>
  • list :需要包含头文件<list>

2. 元素操作函数

cpp 复制代码
staInt.push(1);  // 压栈操作
staInt.push(2);
staInt.pop();    // 弹出栈顶元素(需保证栈非空)
staInt.push(3);

3. 栈顶访问与修改

cpp 复制代码
int& iTop = staInt.top();  // 获取栈顶的引用
iTop = 66;                // 通过引用直接修改栈顶值
staInt.top() = 88;        // 直接修改栈顶元素

4. 容器状态查询

cpp 复制代码
cout << "栈大小: " << staInt.size() << endl;
cout << "是否为空: " << boolalpha << staInt.empty() << endl;

5. 栈遍历与清空

cpp 复制代码
while (!staInt.empty()) {
    cout << staInt.top() << " ";
    staInt.pop();  // 必须弹出才能访问下层元素
}

三、关键特性解析

  1. 底层容器选择

    • vector :动态数组实现,push/pop需要O(1)摊销时间
    • list:链表实现,所有操作保证O(1)时间复杂度
    • deque(默认):分块数组实现,综合性能最优
  2. 元素访问特性

    • top()返回引用,可直接修改栈顶元素
    • 修改栈顶元素不会改变栈的结构特性
  3. 安全操作规范

    • 调用pop()前必须确保栈非空
    • 使用empty()判断替代size() == 0更高效

四、典型应用场景

  1. 函数调用栈模拟
  2. 括号匹配验证
  3. 表达式求值(逆波兰式)
  4. 撤销操作实现

五、完整代码回顾

cpp 复制代码
#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <deque>

using namespace std;

int main(void) {
    // stack对象的默认构造
    // stack<int> staInt;    // 默认使用deque存储元素
    // stack<int, vector<int>> staInt;
    // stack<int, list<int>> staInt;
    stack<int, deque<int>> staInt;

    // stack的push()与pop()方法
    staInt.push(1);
    staInt.push(2);
    // staInt.pop();
    staInt.push(3);

    // int iTop = staInt.top();
    int& iTop = staInt.top();
    iTop = 66;
    cout << "staInt.top: " << staInt.top() << endl;

    staInt.top() = 88;
    cout << "staInt.size: " << staInt.size() << endl;

    cout << "staInt.top: " << staInt.top() << endl;

    while (!staInt.empty()) {
        cout << staInt.top() << " ";
        staInt.pop(); // 栈顶的元素出栈
    }
    cout << endl;

    system("pause");
    return 0;
}

六、代码执行流程

  1. 使用deque作为底层容器构造栈
  2. 依次压入1、2、3(注释掉了pop操作)
  3. 演示通过引用修改栈顶元素
  4. 输出修改后的栈顶值
  5. 遍历并清空栈

输出结果:

复制代码
staInt.top: 66
staInt.size: 3
staInt.top: 88
88 2 1 

七、注意事项

  1. 空栈操作防护 :执行top()pop()前必须检查empty()
  2. 元素生命周期:存储对象时注意引用有效性
  3. 容器选择原则:根据操作频率选择最优底层容器
  4. 异常安全:修改栈顶元素时需考虑可能引发的异常
相关推荐
程序员老舅8 分钟前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
划破黑暗的第一缕曙光21 分钟前
[C++]:2.类和对象(上)
c++·类和对象
季明洵23 分钟前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
墨雪不会编程30 分钟前
C++之【深入理解Vector】三部曲最终章
开发语言·c++
cpp_250133 分钟前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-37 分钟前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
kyle~39 分钟前
ROS2---QoS策略
c++·机器人·ros2
小宋10211 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
爱吃生蚝的于勒1 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
一晌小贪欢1 小时前
Python 爬虫进阶:如何利用反射机制破解常见反爬策略
开发语言·爬虫·python·python爬虫·数据爬虫·爬虫python