C++中的stack容器操作大全

 更新时间:2026年02月11日 09:17:12   作者:你的冰西瓜  
stack是C++标准模板库(STL)中的容器适配器,它提供后进先出(LIFO)的数据结构功能,接下来通过本文给大家讲解C++中的stack容器的相关知识,感兴趣的朋友跟随小编一起看看吧

1.stack概述

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

2. 基本特性

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

3. 头文件与声明

#include <stack>
using namespace std;
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>
using namespace std;
int main() {
    // 创建基于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;
    return 0;
}

9. 底层容器选择

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

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

10. 实际应用示例

10.1 括号匹配检查

bool isBalanced(const string& expr) {
    stack<char> s;
    for (char c : expr) {
        if (c == '(' || c == '[' || c == '{') {
            s.push(c);
        } else {
            if (s.empty()) return false;
            char top = s.top();
            s.pop();
            if ((c == ')' && top != '(') || 
                (c == ']' && top != '[') || 
                (c == '}' && top != '{')) {
                return false;
            }
        }
    }
    return s.empty();
}

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

int evaluatePostfix(const string& exp) {
    stack<int> s;
    for (char c : exp) {
        if (isdigit(c)) {
            s.push(c - '0');
        } else {
            int val1 = s.top(); s.pop();
            int val2 = 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;
            }
        }
    }
    return s.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
访问方式仅栈顶随机访问随机访问
插入/删除位置仅顶端主要末尾两端
迭代器支持不支持支持支持
内存布局依赖底层容器连续分段连续

到此这篇关于C++中的stack容器操作大全的文章就介绍到这了,更多相关C++ stack容器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++容器适配与栈的实现及dequeque和优先级详解

    C++容器适配与栈的实现及dequeque和优先级详解

    这篇文章主要介绍了C++容器适配与栈的实现及dequeque和优先级,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C++中的四种类型转换

    C++中的四种类型转换

    类型转换有c风格的,当然还有c++风格的。c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,
    2015-08-08
  • C语言二叉树与堆的概念与实现

    C语言二叉树与堆的概念与实现

    这篇文章主要给大家介绍了关于C语言二叉树与堆的相关资料,文章详细记录了他们的相关概念以及如何实现的,通过图文介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • QT利用QPainter绘制三维饼状图

    QT利用QPainter绘制三维饼状图

    这篇文章主要为大家详细介绍了如何利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制,感兴趣的可以动手尝试一下
    2022-06-06
  • C语言详解判断相同树案例分析

    C语言详解判断相同树案例分析

    这篇文章主要介绍了用C语言检查两棵树是否相同,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2022-04-04
  • opencv2实现10张图像上下左右拼接融合

    opencv2实现10张图像上下左右拼接融合

    这篇文章主要为大家详细介绍了opencv2实现10张图像上下左右拼接融合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++实现一个简单的SOAP客户端

    C++实现一个简单的SOAP客户端

    这篇文章主要介绍了C++实现一个简单的SOAP客户端,在C++中,一般使用gSOAP来实现客户端、服务端,下面一起进入文章了解具体内容,需要的朋友可以参考一下
    2021-11-11
  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情

    本文以jsoncpp库为基础,设计这样一个可以支持一个函数 可以一行代码 unmarshal /marshal 对象,需要的朋友小伙伴可以参考以下
    2021-09-09
  • C语言链表实现商品库存管理系统

    C语言链表实现商品库存管理系统

    这篇文章主要为大家详细介绍了C语言链表实现商品库存管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 浅谈C++中char型变量的地址输出

    浅谈C++中char型变量的地址输出

    下面小编就为大家带来一篇浅谈C++中char 型变量的地址输出。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论