【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

简介: 在C++中​​std::stack​​​是一个模板类,它是基于容器的适配器,用于实现堆栈数据结构。堆栈是一种后进先出(LIFO)的数据结构,类似于现实生活中的一叠盘子。

@​​TOC​
前言
文章绑定了VS平台下std::stack和std::queue的源码,大家可以下载了解一下😍前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,以及学习了几个STL的结构也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点—— stack & queue(STL)。下面话不多说坐稳扶好咱们要开车了😍
stack

  1. stack概念
    ​​stack 的文档介绍​​
    在C++中​​std::stack​​​是一个模板类,它是基于容器的适配器,用于实现堆栈数据结构。堆栈是一种后进先出(LIFO)的数据结构,类似于现实生活中的一叠盘子。​​std::stack​​​类位于​​​​头文件中,并且是C++标准库的一部分。它提供了一组成员函数和操作符,用于对堆栈进行操作。
  2. stack特点
  3. 后进先出(LIFO):​​std::stack​​是一种后进先出的数据结构,这意味着最后压入堆栈的元素将首先被弹出。
  4. 基于容器的适配器:​​std::stack​​是基于容器的适配器,它使用底层容器来存储元素。默认情况下,​​std::deque​​被用作底层容器,但你也可以选择其他容器,如​​std::vector​​或​​std::list​​。
  5. 快速插入和删除:由于​​std::stack​​是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的压入和弹出。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效。
  6. 无索引访问:​​std::stack​​不支持通过索引访问元素。你只能访问堆栈顶部的元素,即使用​​top()​​函数。如果你需要访问其他位置的元素,你需要先将顶部的元素弹出。
  7. 无迭代器支持:​​std::stack​​不支持迭代器,因此你不能使用迭代器遍历堆栈中的元素。如果你需要遍历堆栈中的元素,你需要先将它们弹出。
  8. 大小可变:​​std::stack​​的大小是可变的,你可以根据需要动态地压入和弹出元素。
  9. stack使用
  10. 包含头文件:首先,你需要包含​​​​​头文件,以便使用​​std::stack​​类。

    include 2. 创建堆栈对象:使用​​std::stack​​类创建一个堆栈对象。你需要指定堆栈中元素的类型。例如,如果你想创建一个存储整数的堆栈,你可以这样做:

    std::stack myStack;3. 压入元素:使用​​push(element)​​​函数将元素压入堆栈的顶部。你可以连续调用​​push()​​函数来压入多个元素。
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);4. 弹出元素:使用​​pop()​​函数从堆栈的顶部移除元素。你可以使用循环或条件语句来连续弹出元素。
    myStack.pop();5. 访问顶部元素:使用​​top()​​函数可以访问堆栈顶部的元素,但不会将其从堆栈中移除。
    int topElement = myStack.top();6. 检查堆栈是否为空:使用​​empty()​​​函数可以检查堆栈是否为空。如果堆栈为空,返回​​true​​​;否则返回​​false​​。
    if (myStack.empty()) {
    // 堆栈为空
    } else {
    // 堆栈不为空
    }7. 获取堆栈的大小:使用​​size()​​函数可以获取堆栈中元素的数量。
    int stackSize = myStack.size();这些是使用​​std::stack​​的一般步骤。可以根据需要进行堆栈的操作,如压入元素、弹出元素、访问顶部元素等。
    queue
  11. queue概念
    ​​queue的文档介绍​​
    在C++中,queue(队列)是一种数据结构,它遵循先进先出(FIFO)的原则。它类似于现实生活中的排队,新元素被添加到队列的末尾,而从队列中移除元素时,总是从队列的前端开始。
  12. queue特点
  13. 先进先出(FIFO):​​std::queue​​是一种先进先出的数据结构,这意味着最先添加到队列的元素将首先被移除。
  14. 基于容器的适配器:​​std::queue​​是基于容器的适配器,它使用底层容器来存储元素。
  15. 快速插入和删除:由于​​std::queue​​是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的添加和移除。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效。
  16. 无索引访问:​​std::queue​​不支持通过索引访问元素。你只能访问队列的前端和末尾元素,即使用​​front()​​和​​back()​​函数。
  17. 无迭代器支持:​​std::queue​​不支持迭代器。如果你需要遍历队列中的元素,你需要先将它们移除。
  18. 大小可变:​​std::queue​​的大小是可变的,你可以根据需要动态地添加和移除元素。
  19. queue使用
  20. 包含头文件:首先,你需要包含​​​​​头文件,以便使用​​std::queue​​类。

    include 2. 创建队列对象:使用​​std::queue​​类创建一个队列对象。你需要指定队列中元素的类型。例如,如果你想创建一个存储整数的队列,你可以这样做:

    std::queue myQueue;3. 添加元素:使用​​push(element)​​​函数将元素添加到队列的末尾。你可以连续调用​​push()​​函数来添加多个元素。
    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);4. 移除元素:使用​​pop()​​函数从队列的前端移除元素。你可以使用循环或条件语句来连续移除元素。
    myQueue.pop();5. 访问前端和末尾元素:使用​​front()​​​函数可以访问队列的前端元素,使用​​back()​​函数可以访问队列的末尾元素,但不会将它们从队列中移除。
    int frontElement = myQueue.front();
    int backElement = myQueue.back();6. 检查队列是否为空:使用​​empty()​​​函数可以检查队列是否为空。如果队列为空,返回​​true​​​;否则返回​​false​​。
    if (myQueue.empty()) {
    // 队列为空
    } else {
    // 队列不为空
    }7. 获取队列的大小:使用​​size()​​函数可以获取队列中元素的数量。
    int queueSize = myQueue.size();这些是使用​​std::queue​​的一般步骤。可以根据需要进行队列的操作,如添加元素、移除元素、访问前端和末尾元素等。
    容器适配器
  21. 什么是适配器
    适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。适配器模式通常用于解决两个不兼容的接口之间的问题。
    在C++中,适配器也可以指代标准库中的容器适配器。容器适配器是一种特殊类型的容器,它使用底层容器来提供不同的接口和功能。适配器通过封装底层容器的操作,提供了一组新的操作和语义。
  22. STL标准库中stack和queue的底层结构
    虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL标准库中​​std::stack​​​和​​std::queue​​​。它们分别基于底层容器(默认为​​std::deque​​)提供了堆栈和队列的功能。
  23. STL标准库中对于stack和queue的模拟实现
    ⭕stack的模拟实现
    template>
    class stack
    {
    public:
    //入栈
    void push(const T& x)
    {
     _con.push_back(x);
    
    }
    //出栈
    void pop()
    {
     _con.pop_back();
    
    }
    //返回栈顶数据
    T& top()
    {
     return _con.back();
    
    }
    //返回const类型栈顶数据
    const T& top() const
    {
     return _con.back();
    
    }
    //判断是否为空
    bool empty()
    {
     return _con.empty();
    
    }
    //返回栈的大小
    size_t size() const
    {
     return _con.size();
    
    }
    private:
    Container _con;
    };⭕stack的模拟实现
    template>
    class queue
    {
    public:
    //进入队列
    void push(const T& x)
    {
     _con.push_back(x);
    
    } //出队列
    void pop()
    {
     _con.pop_front();
    
    }
    //返回队尾数据
    T& back()
    {
     return _con.back();
    
    }
    //返回队头数据
    T& front()
    {
     return _con.front;
    
    }
    //返回const类型队尾数据
    const T& back() const
    {
     return _con.back();
    
    }
    //返回const类型队头数据
    const T& front() const
    {
     return _con.front;
    
    }
    //判断是否为空
    bool empty() const
    {
     return _con.empty();
    
    }
    //返回队列大小
    size_t size() const
    {
     return _con.size();
    
    }
    private:
    Container _con;
    };总结
    stack是一种后进先出(LIFO)的数据结构,它是一种容器适配器。它的特点是最后添加的元素将首先被移除。stack使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。。queue是一种先进先出(FIFO)的数据结构,也是一种容器适配器。它使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。在STL标准库中,stack和queue是基于其他容器实现的容器适配器。它们使用底层容器来存储元素,并提供了堆栈和队列的功能。
    温馨提示
    感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!
    再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
目录
相关文章
|
6月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
252 2
|
2月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
3月前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
3月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
3月前
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
4月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
105 21
|
6月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
6月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
6月前
|
Kubernetes Linux Docker
容器化技术Docker入门与实践
容器化技术Docker入门与实践
112 0