• [C++] STL :stack&&queue详解 及 模拟实现


    标题:[C++] STL :stack&&queue详解

    @水墨不写bug



    目录

    (一)stack简介

    (二)queue简介

    (三)容器适配器

    (四)stack和queue的模拟实现


    1. /**
    2. * _ooOoo_
    3. * o8888888o
    4. * 88" . "88
    5. * (| -_- |)
    6. * O\ = /O
    7. * ____/`---'\____
    8. * . ' \\| |// `.
    9. * / \\||| : |||// \
    10. * / _||||| -:- |||||- \
    11. * | | \\\ - /// | |
    12. * | \_| ''\---/'' | |
    13. * \ .-\__ `-` ___/-. /
    14. * ___`. .' /--.--\ `. . __
    15. * ."" '< `.___\_<|>_/___.' >'"".
    16. * | | : `- \`.;`\ _ /`;.`/ - ` : | |
    17. * \ \ `-. \_ __\ /__ _/ .-` / /
    18. * ======`-.____`-.___\_____/___.-`____.-'======
    19. * `=---='
    20. *
    21. * .............................................
    22. * 佛祖保佑 永无BUG
    23. */

    正文开始:

    (一)stack简介

            通过查询cplusplus我们可以发现stack与以往的容器不同,比如vector;

            比较上图,vector是一种容器;而栈是一种容器适配器。什么是容器适配器?在这里我们放在后文解释,我们首先了解一下什么是栈:

            1.STL的栈是一种容器适配器,栈是一种数据结构,数据遵循后进先出,并且只能从栈的一端进行数据的插入与提取。

            2.栈的功能实现比较简便,我们发现我们可以把vector或者是list当成是一个栈:能把vector或list当成一个栈,是可以把栈实现为容器适配器的原因。

            容器适配器就是将一种特殊的类作为底层容器,并提供一组特定的成员函数来访问元素。

            3.stack的成员函数比较少,功能简单:

    函数说明接口说明
    stack()构造空的栈
    empty()检测stack是否为空
    size()返回stack中元素的个数
    top()返回栈顶元素的引用
    push()将元素val压入stack中
    pop()将stack中尾部的元素弹出


            这些成员函数的具体功能如果你有疑问,可以参考这一篇文章:《栈详解及C实现》


    (二)queue简介

            1.队列也是一种容器适配器,队列是一种数据结构,数据遵循先进先出,数据从容器一端进入,从另一端提取。

            2.STL中,队列通过容器适配器方式实现,在这里,容器适配器就是通过封装一个特定的类,同时提供特定的接口成员函数来访问内部的元素数据。

            3.常见的队列的成员函数有:

    函数声明接口说明
    queue()构造空的队列
    empty()检测队列是否为空,是返回true,否则返回false
    size()返回队列中有效元素的个数
    front()返回队头元素的引用
    back()返回队尾元素的引用
    push()在队尾将元素val入队列
    pop()将队头元素出队列

    (三)容器适配器

            通过上文对两个容器适配器的讲述,你或许已经对容器适配器有了一定的认识。但是容器适配器到底是什么?

            容器适配器是C++中一种特殊类型的容器,它通过封装现有的容器类实现不同的数据结构和功能。容器适配器通过提供不同的接口和封装现有容器的功能,使得程序员可以根据需求选择合适的数据结构。常见的容器适配器有栈(stack)、队列(queue)和优先队列(priority_queue)。

            我们在使用容器适配器的时候,可以选择底层的容器,但是在使用容器适配器的时候,不需要关心底层实现的容器到底是什么。

            比如:我们可以用vector容器或者list容器来实现stack的适配器,如果我们已经成功实现,在使用stack的时候,就不需要关心底层究竟是vector还是list了。

    (四)stack和queue的模拟实现

            我们可以通过使用模板参数T,来使得容器内的数据类型更加灵活;通过设置一个参数Container来接受我们选择的容器。

    模拟实现STL的stack源码:

    1. #pragma once
    2. #include
    3. #include
    4. using namespace std;
    5. namespace ddsm
    6. {
    7. template<class T,class Container = std::deque>
    8. class stack
    9. {
    10. public:
    11. void push(const T& val)
    12. {
    13. _con.push_back(val);
    14. }
    15. void pop()
    16. {
    17. _con.pop_back();
    18. }
    19. bool empty()
    20. {
    21. return _con.empty();
    22. }
    23. size_t size()
    24. {
    25. return _con.size();
    26. }
    27. T& top()
    28. {
    29. return _con.back();
    30. }
    31. private:
    32. Container _con;
    33. };
    34. }

    模拟实现queue:

    1. #pragma once
    2. #include
    3. #include
    4. using namespace std;
    5. namespace ddsm
    6. {
    7. template<class T,class Container = std::deque>
    8. class queue
    9. {
    10. public:
    11. void push(const T& val)
    12. {
    13. _con.push_back(val);
    14. }
    15. void pop()
    16. {
    17. _con.pop_front();
    18. }
    19. T& front()
    20. {
    21. return _con.front();
    22. }
    23. T& back()
    24. {
    25. return _con.back();
    26. }
    27. bool empty()
    28. {
    29. return _con.empty();
    30. }
    31. size_t size()
    32. {
    33. return _con.size();
    34. }
    35. private:
    36. Container _con;
    37. };
    38. }

            在模拟实现中,我们发现模板参数Container给了一个缺省参数deque;deque是STl的一种容器,它具有比vector和list更加复杂的结构,这里我们放在下次分享。


    完~

    未经作者同意禁止转载 

  • 相关阅读:
    前端Get Post Put Delect请求 传参数 不传参数给后端
    ODBC数据源管理器不在指定位置找oracle的SQORAS32.DLL
    【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)
    vlog常用参数解析
    『现学现忘』Docker基础 — 42、补充:save和load命令说明
    深入探究Linux文件:.sh、.swp文件的作用与意义 (linux .sh.swp)
    “滑动窗口”算法专项训练
    docker镜像的创建-Dockerfile
    Java Comparator 自定义复杂排序
    [附源码]Python计算机毕业设计Django失物招领微信小程序论文
  • 原文地址:https://blog.csdn.net/2301_79465388/article/details/140376250