IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> stack与queue模拟实现 -> 正文阅读

[数据结构与算法]stack与queue模拟实现

stack与queue的模拟实现

容器适配器

适配器是一种设计模式(设计模式是一套反复使用的、大部分人知道的代码设计经验的总结),该模式试讲一个类的接口转化为用户希望的另一个接口,虽然stack与queue中也可以存放元素,但在STL中并没有将其划分为容器,而是成为容器适配器,这是因为stack与队列只是堆其他容器进行了包装,STL中的stack和queue是使用双端队列进行封装的。

双端队列

概念

它是一种双开口的连续空间数据结构(与队列没有关系),双开口的含义是可以再两端进行插入删除操作,且时间复杂度为O(1),与vector比较,头插效率比较高,不需要移动数据,与list比较,空间利用率高。

结构

?

deque并不是真正的连续空间,而是使用一小段连续的小空间拼接而成,实际上deque类似于一个动态的二维数组,其底层结构如下图所示:

?

中控数组map:?map数组是一个指针数组,指向多个buff数组用来储存数据,当buff数组头或尾满了,就新开辟一个buff数组,其指针存在map的相对应位置,当map数组满了,会对map数组扩容(指针数组的扩容并不会效率低)

deque迭代器

deque所谓的连续空间是一个假象,是他底层复杂的迭代器实现

STL源码:

typedef T** map_pointer;
T* cur;
T* first;
T* last;
map_pointer node

cur:是当前的node指向的buff数组当前指向的地址

first:是当前node指向的buff数组,第一个元素的地址。

last:是当前node指向的buff数组,最后一个元素的地址。

node:是指向当前map数组对应的指针,由于他指向的也是一个指针·,所以为二级指针。

优缺点

优点:

双端队列,说明他很合适头插头删,尾插尾删,他去做stack和queue的容器适配器很合适。

缺点:

双端队列中间插入删除非常麻烦,效率不高。

deque是一种折中的方案设计,随机访问效率不如vector,任意插入删除不及list

stack模拟

  1. stack是一种容器适配器,专门在具有后进先出的上下文环境中,其删除只能是在一端进行操作。

  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出 。

  3. stack的底层原理可以是任何标椎的容器类模板或者一些特定的容器类,这些容器类应该支持以下操作:

empty:判空操作。

back:尾部元素获取。

push_back:尾部插入元素操作

·· pop_back:尾部删除元素操作。

模拟实现

template<class T, class Con = deque<T>>
 ? ?class stack
 ?  {
 ? ?public:
 ? ? ? ?stack();
 ? ? ? ?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;
 ?  };
?

queue模拟实现

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素

  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列

  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

empty:检测队列是否为空

size:返回队列中有效元素的个数

front:返回队头元素的引用

back:返回队尾元素的引用

push_back:在队列尾部入队列

pop_front:在队列头部出队列

模拟实现

template<class T, class Con = deque<T>>
 ? ?class queue
 ?  {
 ? ? ? ?public:
 ? ? ? ? ? ?queue();
 ? ? ? ? ? ?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;
 ?  };

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:50:35  更:2022-03-30 18:51:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:58:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码