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的简单介绍


相关文章
|
2月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
39 1
|
2月前
|
设计模式 存储 C++
C++之stack 和 queue(下)
C++之stack 和 queue(下)
38 1
|
2月前
|
存储 算法 C语言
【C++】C++ STL探索:Priority Queue与仿函数的深入解析(一)
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
|
2月前
|
C++ 容器
C++之stack 和 queue(上)
C++之stack 和 queue(上)
62 0
|
2月前
|
存储 C++ 容器
C++番外篇——stack、queue的实现及deque的介绍
C++番外篇——stack、queue的实现及deque的介绍
25 0
|
2月前
|
存储 算法 C++
C++入门10——stack与queue的使用
C++入门10——stack与queue的使用
45 0
|
2月前
|
C++
【C++】C++ STL探索:Priority Queue与仿函数的深入解析(三)
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
|
2月前
|
编译器 程序员 C++
【C++】C++ STL探索:Priority Queue与仿函数的深入解析(二)
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
|
19天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
29 2
|
25天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
59 5