stack和queue的模拟实现

文章目录

如何实现?

首先我们看看官网上的stack,官网上的stack是用deque作为模版的缺省值去实现的,deque是什么?

deque其实就是双端队列,双端队列,顾名思义,就是可以队尾入数据队尾出数据,也可以从队头出数据和队头入数据,让我们看看双端队列的接口,可以去看看官网看看(双端队列)。

双端队列就类似于链表和顺序表的结合版,不仅可以首插和尾插还支持[]随机访问。

实现stack

在学习C++的时候我们知道函数有缺省参数,那类比过来,其实模版也有缺省参数,我们马上要实现的stack就有模版参数。

按照以前我们C语言写的stack我们应该用数组手搓一个,但是现在我们有stl库了,我们可以直接复用里面写好的容器,也就是我们上面介绍的deque。

c 复制代码
 template<class T, class Con = deque<T>>
 class stack
 {
 public:
     void push(const T& x)
     {
         _c.push_back(x);
     }
     void pop()
     {
         _c.pop_back();
     }
     T& top()
     {
         return _c.back();
     }
     const T& top()const
     {
         return _c.back();
     }
     size_t size()const
     {
         return _c.size();
     }
     bool empty()const
     {
         return _c.empty();
     }
 private:
     Con _c;
 };

我们直接复用STL里写好的接口,其实上面这种模式是一种设计方式,被称为容器适配器。

容器适配器的优点:

  1. 简化使用

    容器适配器提供了统一的接口,使得不同类型的容器类更易于使用。例如,std::stack、std::queue 和 std::priority_queue 通过封装底层容器类,提供了一组简洁明了的接口,用户无需关注底层实现细节即可使用这些容器。

  2. 隐藏实现细节

    容器适配器隐藏了底层容器类的实现细节。用户只需关注适配器提供的接口,而不需要了解底层容器类的具体实现。这有助于提高代码的可读性和可维护性。

  3. 提高代码可维护性

    由于容器适配器提供了统一的接口和抽象层,代码的可维护性得到了提高。如果底层容器类发生了变化,只需修改容器适配器的实现,而不需要修改使用适配器的代码。

  4. 代码复用

    通过使用容器适配器,可以实现代码复用。适配器封装了常见的容器操作,如 push、pop、top 等,避免了重复实现这些操作的需求,提高了代码的复用性。

实现queue

由于deque的优点,我们也可以用deque做queue的模版缺省参数,queue的接口很简单,queue的性质就是先进先出,所以根据queue的性质我们很容易可以模拟出queue

c 复制代码
  template<class T, class Con = deque<T>>
  class queue
  {
  public:
      void push(const T& x)
      {
          _c.push_back(x);
      }
      void pop()
      {
          _c.pop_front();
      }
      T& back()
      {
          return _c.back();
      }
      const T& back()const
      {
          return _c.back();
      }
      T& front()
      {
          return _c.front();
      }
      const T& front()const
      {
          return _c.front();
      }
      size_t size()const
      {
          return _c.size();
      }
      bool empty()const
      {
          return _c.empty();
      }
  private:
      Con _c;
  };
};

总结

通过对 C++ 中 stack 和 queue 的模拟实现,我们深入了解了容器适配器的工作原理和优势。这些适配器通过封装底层容器,提供了简洁而统一的接口,使得数据结构的操作变得更加直观和便捷。我们的模拟实现展示了如何利用已有的容器类来构建自定义的数据结构,同时也强调了代码复用和隐藏实现细节的重要性。

在实际开发中,选择合适的数据结构和容器适配器能够显著提升代码的可读性、可维护性和性能。因此,熟练掌握和灵活运用这些基础工具,是每一个 C++ 开发者必备的技能。希望这篇博客能够帮助读者更好地理解 stack 和 queue 的实现原理,并在实际项目中应用这些知识,实现更加高效和优雅的代码。

感谢大家的阅读,如果你有任何疑问或建议,欢迎在评论区留言讨论。

相关推荐
Lhan.zzZ32 分钟前
笔记_2026.4.28_004
c++·ide·笔记·qt
wuminyu2 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
木喃的井盖3 小时前
无锁队列细节
c++·工程
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:输出亲朋字符串
c++·字符串·csp·高频考点·信奥赛·专项训练·输出亲朋字符串
WBluuue4 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
KuaCpp4 小时前
C++面向对象(速过复习版)
开发语言·c++
jiushiapwojdap6 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
纽扣6677 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
智者知已应修善业7 小时前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
AI进化营-智能译站8 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai