• 【c++】模拟实现stack和queue


    全部代码

    1. #pragma once
    2. #include
    3. using namespace std;
    4. namespace hqj
    5. {
    6.     template<class Tclass Con = deque>
    7.     class stack
    8.     {
    9.     public:
    10.         stack()
    11.             :_c()
    12.         {}
    13.         void push(const T& x)
    14.         {
    15.             _c.push_back(x);
    16.         }
    17.         void pop()
    18.         {
    19.             _c.pop_back();
    20.         }
    21.         T& top()
    22.         {
    23.             return _c.back();
    24.         }
    25.         const T& top()const
    26.         {
    27.             return _c.back();
    28.         }
    29.         size_t size()const
    30.         {
    31.             return _c.size();
    32.         }
    33.         bool empty()const
    34.         {
    35.             return _c.empty();
    36.         }
    37.     private:
    38.         Con _c;
    39.     };
    40.  }
    • 队列

    1.     template<class Tclass Con = deque>
    2.     class queue
    3.     {
    4.     public:
    5.         queue()
    6.             :_c()
    7.         {}
    8.        void push(const T& x)
    9.         {
    10.             _c.push_back(x);
    11.         }
    12.     
    13.         void pop()
    14.         {
    15.             _c.pop_front();
    16.         }
    17.         T& back()
    18.         {
    19.             return _c.back();
    20.         }
    21.         const T& back()const
    22.         {
    23.             return _c.back();
    24.         }
    25.         T& front()
    26.         {
    27.             return _c.front();
    28.         }
    29.         const T& front()const
    30.         {
    31.             return _c.front();
    32.         }
    33.         size_t size()const
    34.         {
    35.             return _c.size();
    36.         }
    37.         bool empty()const
    38.         {
    39.             return _c.empty();
    40.         }
    41.     private:
    42.         Con _c;
    43.     };
    44. }

    栈的模拟实现

    模板参数

    • 选择deque作为栈的底层容器

    1. template<class T, class Con = deque<T>>

    私有成员

    • 一个容器对象_con

    Con _c;
    

    构造函数

    • 因为_c是个容器对象,自身有构造函数,构造stack时会自动调用_C的构造函数,所以我们可以不写

    1.  stack()
    2.             :_c()
    3.         {}

    push函数

    • 栈的特点为栈顶入栈、栈顶出栈

    • 我们之间使用容器对象_c的尾插函数便可以实现栈的入栈

    1.  void push(const T& x)
    2.         {
    3.             _c.push_back(x);
    4.         }

    pop 函数

    • 栈的特点为栈顶入栈、栈顶出栈

    • 我们之间使用容器对象_c的尾删函数便可以实现栈的出栈

    1.         void pop()
    2.         {
    3.             _c.pop_back();
    4.         }

    top函数

    • 栈顶恰恰是底层容器的末元素,我们直接调用底层容器_c的back函数即可

    • 提供两个版本,一个是const、另一个是非const

    1.         T& top()
    2.         {
    3.             return _c.back();
    4.         }
    5.         const T& top()const
    6.         {
    7.             return _c.back();
    8.         }

    size函数

    • 底层容器中有多少数据就代表栈有多少数据,直接复用底层容器_c的size

    1.         size_t size()const
    2.         {
    3.             return _c.size();
    4.         }

    判空函数

    • 底层容器不为空栈也就不为空,还是直接复用底层容器_c的empty

    1.         bool empty()const
    2.         {
    3.             return _c.empty();
    4.         }

    队列

    构造函数

    • 队列也是容器适配器的玩法,直接调用底层容器_C的构造函数

    1.  queue()
    2.             :_c()
    3.         {}

    模板参数

    • 选择deque作为队列的底层容器

    1. template<class T, class Con = deque<T>>

    私有成员

    • 一个容器对象_con

    Con _c;
    

    push函数

    • 队列的特点是队尾入队,队头出队

    • 根据特点,我们调用底层容器的尾插函数即可

    1.        void push(const T& x)
    2.         {
    3.             _c.push_back(x);
    4.         }

    pop函数

      • 队列的特点是队尾入队,队头出队

    • 根据特点,我们调用底层容器的头删函数即可

    1.         void pop()
    2.         {
    3.             _c.pop_front();
    4.         }

    back函数

    • 该接口负责返回队尾元素

    • 而队尾恰恰是底层容器的末元素,直接复用底层容器的back函数

    1.         T& back()
    2.         {
    3.             return _c.back();
    4.         }
    5.         const T& back()const
    6.         {
    7.             return _c.back();
    8.         }

    front函数

    • 该接口负责返回队头元素

    • 而队头恰恰是底层容器的首元素,直接复用底层容器的front函数

    1.         T& front()
    2.         {
    3.             return _c.front();
    4.         }
    5.         const T& front()const
    6.         {
    7.             return _c.front();
    8.         }

    size函数

    • 底层容器有多少数据,该队列就有多少数据,依然是复用即可

    1.         size_t size()const
    2.         {
    3.             return _c.size();
    4.         }

    empty函数

    • 底层容器不为空,队列便不为空,复用底层容器的判空函数

    1.         bool empty()const
    2.         {
    3.             return _c.empty();
    4.         }

    总结

    介绍栈和队列的模拟实现,之前有在C语言阶段实现过栈和队列,所以本文对栈和队列的结构不做解释。玩法是容器适配器玩法,底层容器选择的是双端队列,这是一种又像数组又像链表的东西。

  • 相关阅读:
    Vue/ Vue 路由配置 (重温 ) 一级 二级 路由配置 及 路由各种方法重定向 (浏览器渲染)
    Numpy数组基础知识_Python数据分析与可视化
    Java集合框架(一)-ArrayList
    c++源码编译过程(翻译阶段)的若干细节概要
    Java XSSFWorkbook 常用表格操作
    什么是MVC
    从计网的角度讲明白什么是网关
    基于leetcode的算法训练:Day3
    RCE 远程代码执行漏洞分析
    Python代码运行速度提升技巧!Python远比你想象中的快~
  • 原文地址:https://blog.csdn.net/ZHENGZJM/article/details/134020319