C++初阶 stack和queue的模拟实现

简介: C++初阶 stack和queue的模拟实现

容器适配器


在模拟实现stack和queue之前我们首先要知道容器适配器是一个什么样子的概念


“容器适配器是一个封装了序列容器的一个类模板,它在一般的序列容器的基础上提供了一些不同的功能。之所以称为容器适配器,是因为它是适配容器来提供其它不一样的功能。通过对应的容器和成员函数来实现我们需要的功能。”


上面一些比较官方的解释


那么我们怎么通俗的理解容器适配器的概念呢?


实际上虽然stack和queue都可以存储数据


但是它们实际上是由其他容器封装而成的(参考迭代器)


所以说它们算不上是一个容器 只能说是一个由容器适配的适配器


Stack模拟实现


知道了容器适配器的概念之后我们再来实现下Stack


这里我们用来适配的容器叫做deque 在本文末尾会有简单的介绍


接口函数一览


f6202e2069b44eed8e10a0e294333c5c.png

代码一览


因为这里代码比较简单 只有格式上稍微要注意点 这里我就不一一解释了 大家仔细看一遍应该就都会了


namespace shy
{
  template<class T, class Container = std::deque<T>>
  class myStack
  {
  public:
  // 入栈
  void push_back(const T& x)
  {
    _con.push_back(x);
  }
  // 出栈
  void pop()
  {
    _con.pop_back();
  }
  // 获取栈顶元素
  T& top()
  {
    return _con.back();
  }
  //获取栈中有效元素个数
  size_t size() const
  {
    return _con.size();
  }
  //判断栈是否为空
  bool empty() const
  {
    return _con.empty();
  }
  //交换两个栈中的数据
  void swap(mystack<T, Container>& st)
  {
    _con.swap(st._con);
  }
  private:
  Container _con;
  };
}

Queue的模拟实现


接口函数一览

35a5a1740c224f5abf8b8c49df384248.png


代码一览

这里和stack的代码大同小异


还是一样不做过多讲解了 大家看看就好


namespace shy
{
  template<class T, class Container = std::deque<T>>
  class queue
  {
  public:
  //入队列
  void push(const T& x)
  {
    _con.push_back(x);
  }
  //出队列
  void pop()
  {
    _con.pop_front();
  }
  //获取队头元素
  T& front()
  {
    return _con.front();
  }
  //获取队尾元素
  T& back()
  {
    return _con.back();
  }
  const T& back() const
  {
    return _con.back();
  }
  //获取队列中有效元素个数
  size_t size() const
  {
    return _con.size();
  }
  //判断队列是否为空
  bool empty() const
  {
    return _con.empty();
  }
  //交换两个队列中的数据
  void swap(queue<T, Container>& q)
  {
    _con.swap(q._con);
  }
  private:
  Container _con;
  };
}


deque的简单介绍


deque的结构大概是一个这样子的状态

6b241d74fedb496fa62daefe21e2be11.png


它由一个中控数组和一系列的小数组组成(一般大小固定为8个)


我们首先使用中间的哪个中控数组指向的地址


当我们需要尾插的时候 我们在小数组内插入元素


如果说小数组内部的元素被插入满了


那么我们的中控数组就开始指向下一个小数组继续插入数据


往前插同理


deque的优点和缺点都是均衡


它可以做到随机访问 但是访问的过程中实际上还是会经过一定的计算


它可以尽量减少空间的浪费 但是还是会不可避免的浪费掉一定的空间


所以说只有在像栈和队列这种比较需要前插和尾插效率且需要一定的内存命中率的数据结构中 deque才有一席之地


总结


本文主要介绍了Stack和queue的模拟实现以及deque的简单介绍


相关文章
|
1月前
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
2月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
74 21
|
5月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
75 1
|
5月前
|
设计模式 存储 C++
C++之stack 和 queue(下)
C++之stack 和 queue(下)
84 1
|
5月前
|
C++ 容器
C++之stack 和 queue(上)
C++之stack 和 queue(上)
131 0
|
5月前
|
存储 C++ 容器
C++番外篇——stack、queue的实现及deque的介绍
C++番外篇——stack、queue的实现及deque的介绍
47 0
|
5月前
|
存储 算法 C++
C++入门10——stack与queue的使用
C++入门10——stack与queue的使用
71 0
|
1月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
15天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
39 16
|
8天前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。