【041】从零开始:逐步学习使用C++ STL中的stack容器

这篇具有很好参考价值的文章主要介绍了【041】从零开始:逐步学习使用C++ STL中的stack容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言


💡 作者简介:一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【040】巧妙地穿梭双端:掌握C++ STL中deque容器的强大功能

一、stack容器概述

stack是一种先进后出(First In Last OutFILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素入栈的操作称为:push,将元素推出stack 的操作称为pop。
【041】从零开始:逐步学习使用C++ STL中的stack容器,C++从零开始到精通,学习,c++,开发语言,stl,算法,openstack,数据结构
Stack所有元素的进出都必须符合"先进后出"的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。

二、stack容器常用API

C++的stack容器是通过<stack>头文件提供的。

  1. 构造函数:

    • stack<T> s:创建一个空的stack,其中T是数据类型。
  2. 成员函数:

    • push(const T& val):将元素val压入栈顶。
    • emplace(Args&&... args):通过参数构造一个元素并将其压入栈顶。
    • pop():移除栈顶元素。
    • top():返回栈顶元素的引用。
    • empty():检查栈是否为空,返回布尔值。
    • size():返回栈中元素的个数。
  3. 非成员函数:

    • swap(stack<T>& other):交换两个栈的内容。

stack不提供遍历功能,因为它是一种后进先出(LIFO)数据结构。

2.1、构造函数

stack容器的构造函数原型如下:

explicit stack(const Container& cont = Container());

其中,Container是可选参数,用于指定底层容器类型,默认为deque

以下是几个使用示例:

示例 1:使用默认构造函数创建空的stack

#include <iostream>
#include <stack>

int main() {
    std::stack<int> s; // 默认构造函数创建一个空的stack

    if (s.empty()) {
        std::cout << "Stack is empty!" << std::endl;
    }

    return 0;
}

示例 2:使用vector作为底层容器创建stack

#include <iostream>
#include <stack>
#include <vector>

int main() {
    std::stack<int, std::vector<int>> s; // 使用vector作为底层容器

    s.push(10);
    s.push(20);
    s.push(30);

    while (!s.empty()) {
        std::cout << s.top() << " "; // 输出栈顶元素
        s.pop(); // 弹出栈顶元素
    }
    
    return 0;
}

示例 3:使用现有容器初始化stack

#include <iostream>
#include <stack>
#include <list>

int main() {
    std::list<int> values = {1, 2, 3, 4};

    std::stack<int, std::list<int>> s(values); // 使用现有容器初始化stack

    while (!s.empty()) {
        std::cout << s.top() << " "; // 输出栈顶元素
        s.pop(); // 弹出栈顶元素
    }

    return 0;
}

这些示例展示了如何使用stack容器的构造函数来创建空的栈或从现有容器初始化栈。可以根据需要选择不同的底层容器类型,如默认的deque或用户指定的vectorlist等。

2.2、赋值操作

可以使用std::stack模板类中的成员函数swap()来交换两个栈的内容实现赋值的效果。

swap()函数的原型如下:

void swap(stack& other);

使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack1;
    std::stack<int> stack2;

    stack1.push(1);
    stack1.push(2);
    stack1.push(3);

    stack2.push(4);
    stack2.push(5);

    std::cout << "Stack 1: ";
    while (!stack1.empty()) {
        std::cout << stack1.top() << " "; // 输出栈1的元素
        stack1.pop();
    }
    
    std::cout << "\nStack 2: ";
    while (!stack2.empty()) {
        std::cout << stack2.top() << " "; // 输出栈2的元素
        stack2.pop();
    }

    stack1.swap(stack2); // 交换栈1和栈2的内容

    std::cout << "\nStack 1 after swapping: ";
    while (!stack1.empty()) {
        std::cout << stack1.top() << " "; // 输出交换后的栈1的元素
        stack1.pop();
    }

    std::cout << "\nStack 2 after swapping: ";
    while (!stack2.empty()) {
        std::cout << stack2.top() << " "; // 输出交换后的栈2的元素
        stack2.pop();
    }

    return 0;
}

输出:

Stack 1: 3 2 1 
Stack 2: 5 4 
Stack 1 after swapping: 5 4 
Stack 2 after swapping: 3 2 1 

以上示例中,通过调用swap()函数来交换了两个栈stack1stack2的内容。这样就实现了将一个栈的元素赋值给另一个栈的效果。

2.3、数据存取操作

std::stack容器的数据存取操作函数包括:

  • top():返回栈顶元素的引用,但不会删除该元素。
  • push(const T& value):将元素插入到栈顶。
  • pop():移除栈顶元素,没有返回值。

使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack;

    stack.push(1);
    stack.push(2);
    stack.push(3);

    // 访问栈顶元素
    int topElement = stack.top();
    std::cout << "Top element: " << topElement << std::endl;

    // 修改栈顶元素
    stack.top() = 4;

    // 移除栈顶元素
    stack.pop();

    std::cout << "Stack elements:";
    while (!stack.empty()) {
        std::cout << " " << stack.top();
        stack.pop();
    }
    std::cout << std::endl;

    return 0;
}

输出:

Top element: 3
Stack elements: 2 1

2.4、大小操作

std::stack容器提供了以下函数来进行大小操作:

  • empty():返回栈是否为空,如果栈为空则返回true,否则返回false
  • size():返回栈中元素的数量。

以下是这些函数的函数原型和使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack;

    stack.push(1);
    stack.push(2);
    stack.push(3);

    bool isEmpty = stack.empty();
    std::cout << "Is stack empty? " << (isEmpty ? "Yes" : "No") << std::endl;

    size_t stackSize = stack.size();
    std::cout << "Stack size: " << stackSize << std::endl;

    return 0;
}

输出:

Is stack empty? No
Stack size: 3

三、使用stack容器实现一个高效的算法

使用C++的stack容器实现简单算法,该算法用于判断一个字符串中的括号是否匹配。

#include <iostream>
#include <stack>
#include <string>

bool isBracketMatching(const std::string& str) {
    std::stack<char> brackets;

    for (char ch : str) {
        if (ch == '(' || ch == '[' || ch == '{') {
            brackets.push(ch);
        } else if (ch == ')' || ch == ']' || ch == '}') {
            // 如果当前字符为右括号
            if (brackets.empty()) {
                // 栈为空,无法匹配
                return false;
            } else {
                char top = brackets.top();
                brackets.pop();

                // 判断栈顶元素与当前右括号是否匹配
                if ((top == '(' && ch != ')') ||
                    (top == '[' && ch != ']') ||
                    (top == '{' && ch != '}')) {
                    return false;
                }
            }
        }
    }

    // 所有字符遍历完成后,栈为空才说明括号全部匹配
    return brackets.empty();
}

int main() {
    std::string str1 = "({})[]"; // 匹配
    std::string str2 = "{[}]";   // 不匹配

    std::cout << "字符串1括号" << (isBracketMatching(str1) ? "匹配" : "不匹配") << std::endl;
    std::cout << "字符串2括号" << (isBracketMatching(str2) ? "匹配" : "不匹配") << std::endl;

    return 0;
}

首先,我们遍历字符串中的每个字符,如果遇到左括号('(''[''{'),我们将其压入栈中。当遇到右括号时,我们检查栈顶元素是否与当前右括号匹配,并将栈顶元素弹出。如果任何时刻栈为空、栈顶元素与当前右括号不匹配,或者遍历结束后栈仍然非空,那么就意味着括号不匹配。

main()函数中,我们测试了两个字符串的括号匹配情况,并输出相应的结果。

运行上述代码,输出:

字符串1括号匹配
字符串2括号不匹配

示例演示了如何利用C++的stack容器来实现一个简单算法,通过使用栈来追踪括号的嵌套关系,并判断括号是否匹配。这只是stack容器的一个简单应用示例,而stack还有其他更多有用的功能可以探索和利用。

总结

深入讲解了C++ STL中的stack容器的基本概念和操作。首先介绍了栈的定义和特点,然后详细解释了stack容器的创建和管理方法,包括入栈、出栈和访问栈顶元素等操作。此外,还重点探讨了stack容器的大小操作函数,并通过实例加深了对其用法的理解。通过本文的学习,读者能够全面了解如何在C++中运用stack来实现栈结构,并且能够合理地利用stack提高代码效率和可读性。无论读者是初学者还是有一定经验的开发者,本文都能帮助他们掌握使用C++ STL中的stack容器的技巧和技能,为日后的编程工作打下坚实的基础。

【041】从零开始:逐步学习使用C++ STL中的stack容器,C++从零开始到精通,学习,c++,开发语言,stl,算法,openstack,数据结构文章来源地址https://www.toymoban.com/news/detail-595561.html

到了这里,关于【041】从零开始:逐步学习使用C++ STL中的stack容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

    适配器是一种设计模式 (设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 例如我们常见的充电器就是一种适配器,它将我们常用的220V交流电压转化为4,5V (或者其他更高的电

    2023年04月26日
    浏览(48)
  • STL容器适配器 -- stack和queue(使用+实现)(C++)

    栈和队列数据结构+画图分析如果对栈和队列的结构不了解的,可以先看该链接的内容 使用stack时需要头文件 #includestack stack是一种容器适配器,用于具有 后进先出 (LIFO)的环境中。只能从容器的一端(栈顶),执行删除、插入和提取操作。 stack是作为容器适配器实现的,容器

    2024年02月14日
    浏览(47)
  • 【C++】开始使用stack 与 queue

    送给大家一句话: 忍受现实给予我们的苦难和幸福,无聊和平庸。 – 余华 《活着》 在之前的学习中,我们已经对 STL 模板中的 string list vector 等容器进行了详细的探讨,从而获得了对这些容器操作的清晰理解。基于这些知识,现在转向学习 stack(栈) 和 queue(队列)就显得

    2024年04月23日
    浏览(21)
  • 【C++】STL之容器适配器——使用deque适配stack和queue

    个人主页:🍝在肯德基吃麻辣烫 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文章主要介绍容器适配器的功能,以及一个适配的场景。 容器适配器,按字面意思理解的话,就是用来对一个容器进行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    浏览(42)
  • 【C++】STL中stack,queue容器适配器的模拟实现(使用deque容器)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和

    2024年02月15日
    浏览(33)
  • 【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

    目录  前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结:         C++的学习难度大,内容繁多。因此我们要及时掌握C++的各种特性,因此我们更新本篇文章,向大家介绍C++的新增特性。 委托构造函数是指一 个类的构造函数调用另一个类的构造函数,以减少代

    2024年02月13日
    浏览(56)
  • 【从零开始学习C++ | 第二十二篇】C++新增特性(下)

    目录 前言: 类型推导: constexpr: 初始化列表: 基于范围的for循环: 智能指针之unique ptr Lambda表达式: 总结:         本文我们将继续介绍   C++ 11 新增十大特性的剩余六个,如果没有看过介绍前四个特性的小伙伴的可以点进我C++的专栏就可以看到。 类型推导(

    2024年02月14日
    浏览(53)
  • 【如何从零基础小白开始学习C++详细介绍】

    如果你想从零基础开始学习C++并最终成为一个“大佬”级别的专家,你需要遵循一个阶段性的学习计划,并且不断练习和深入研究,下面是学习方向的学习阶段 学习编程基础 了解编程的基本概念,如变量、数据类型、运算符、控制结构(循环、条件判断)、函数等。 安装开

    2024年02月20日
    浏览(43)
  • 【C++】STL--stack&quene

    这一节主要学习stack、quene和priority_quene的使用以及模拟实现,最后介绍了容器适配器。 目录 stack的介绍和使用 stack的介绍 stack的使用 stack的模拟实现 queue的介绍和使用 queue的介绍 queue的使用 queue的模拟实现 priority_queue的介绍和使用 priority_queue的介绍 priority_queue的使用 priorit

    2024年04月23日
    浏览(29)
  • C++ STL stack & queue

    目录 一.stack 介绍  二.stack 使用 三.stack 模拟实现 普通版本: 适配器版本: 四.queue的介绍 五. queue使用 六.queue模拟实现 七.deque介绍 1.容器适配器 2.deque的简单介绍 3.deque的缺陷 4.为什么选择deque作为stack和queue的底层默认容器 stack------reference 1. stack是一种容器适配器,专门用在

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包