• Stack是一种先进后出的数据结构,他只有一个出口
  • stack允许 新增元素、移除元素、取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为

Stack定义的完整列表 (双端队列作为Stack的底层容器)

  • 将deque作为Stack的底部结构,对其原有的接口进行适配,使其满足"先进后出"的特性
  • deque是双向开口的数据结构,只需要封闭deque的头端开口(缺省实现),便轻而易举的形成了一个stack。
  • Stack基于deque,这种“修改某物的接口 形成另外一种事物的”的性质归结为 adapter (配接器),因此将stack不归类为容器,而将其归结为 container adapter (容器适配器)
  • 先前自己写的 STL版的 deque 缺失的代码比较多,因此下面的代码中 class Sequence = std::deque<T> 借用STL标准库的deque实现
//定义在stl_config.h文件中
//但是没有找到 具体详情参见 参考链接
# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
# define __STL_NULL_TMPL_ARGS <>
# else
# define __STL_NULL_TMPL_ARGS
# endiftemplate <class T,class Sequence = std::deque<T>>
class stack{//__STL_NULL_TMPL_ARGS会展开为 <> friend bool operator== __STL_NULL_TMPL_ARGS(const stack&,const stack&);friend bool operator< __STL_NULL_TMPL_ARGS(const stack&,const stack&);
public:typedef typename Sequence::value_type value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference;
protected://底层容器Sequence c;
public://以下完全使用Sequence c的操作,完成stack的操作bool empty() const {return c.empty();}size_type size() const {return c.size();}reference top() {return c.back();}const_reference top() const {return c.back();}//deque 是两头可以进出,stack是末端进,末端出 (所以后进者先出)void push(const value_type& x){ c.push_back(x);}void pop(){return c.pop_back();}
};template <class T,class Sequence>
bool operator==(const stack<T,Sequence>&x,const stack<T,Sequence>&y){return x.c == y.c;
}template <class T,class Sequence>
bool operator<(const stack<T,Sequence>&x,const stack<T,Sequence>&y){return x.c < y.c;
}

Stack没有迭代器

  • 考虑到只有stack的顶端的元素才会被外界取用,因此 stack不需要提供遍历元素的迭代器

基于底层容器链表list的Stack

  • Stack需要的函数如 empty、size()、back、push_back、pop_back是链表也支持的
  • 使用范例
#include <stack>
#include <list>
#include <iostream>
#include <algorithm>int main(){std::stack<int,std::list<int>>list_stack;list_stack.push(1);list_stack.push(3);list_stack.push(5);list_stack.push(7);std::cout << list_stack.size() << std::endl; //4std::cout << list_stack.top() << std::endl;  //7list_stack.pop();std::cout << list_stack.top() << std::endl; //5list_stack.pop();std::cout << list_stack.top() << std::endl; //3list_stack.pop();std::cout << list_stack.top() << std::endl; //1std::cout << list_stack.size() << std::endl; //1
}

参考链接

  • 【c++从菜鸡到王者】第六篇:详解晦涩难懂的c++语法_Sefr后端-CSDN博客
  • SGI STL-----__STL_NULL_TMPL_ARGS_yde的博客-CSDN博客
  • 《STL源码剖析》-- stl_config.h_一个人的战争-CSDN博客

STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器相关推荐

  1. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  2. STL源码剖析 slist单向链表概述

    概述 SGI STL的list是一个双向链表,单向链表是slist,其不在标准规格之内 单向和双向链表的区别在于,单向链表的迭代器是单向的 Forward Iterator,双向链表的迭代器属于双向的 ...

  3. STL源码剖析(一)STL简介

    STL源码剖析(一)STL简介 文章目录 STL源码剖析(一)STL简介 一.STL概述 二.STL六大组件 2.1 容器(containers) 2.2 算法(algorithms) 2.3 迭代器 ...

  4. 《STL源码剖析》相关面试题总结

    一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...

  5. C++ STL源码剖析 笔记

    写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...

  6. STL源码剖析之配接器

    adapter(配接器)在STL组件的灵活组合运用上,扮演者转换器的角色.adapter来源于一种适配器模式,其功能是:将一个class接口转换为另一个class的接口,使得原本因接口不兼容而不能合作 ...

  7. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...

  8. STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)

    文章目录 介绍 Level 0:使用C++标准库 0 STL六大部件 0.1 六大部件之间的关系 0.2 复杂度 0.3 容器是前闭后开(左闭右开)区间 1 容器的结构与分类 1.1 使用容器Arra ...

  9. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

最新文章

  1. centos共享linux文件夹权限,CENTOS7 搭建文件服务器:samba共享linux文件夹
  2. 用linux集成电路版图设计,集成电路版图设计教程2012版本
  3. C++:34---union:联合/共用体,一种节省空间的类
  4. IDEA创建.properties文件
  5. sftp方式从windows上传文件到Linux服务器
  6. VSCode配置jupyter逐行语句运行python
  7. 南加大计算机科学博士,美国南加州大学计算机科学博士专业介绍
  8. 中国证券IT发展简史(上)
  9. mysql中Mysql模糊查询like效率,以及更高效的写法和sql优化方法
  10. Win10设置系统保护色
  11. matlab 求最大值函数,利用matlab, 二元函数求最大值
  12. ec12编码器电路图_旋转编码器电路原理图
  13. word 批量替换空格和回车
  14. 4g网络什么时候淘汰_4g网络手机。什么时候淘汰
  15. python 录屏_python实现录制全屏和选择区域录屏功能
  16. FCM推送 push
  17. There is no setter for property named ‘id‘ in ‘class com.atguigu.mybatistest.entity.User‘
  18. 大于4GB镜像文件刻录方法
  19. Delfoi CUT 3D切割和精加工工艺离线编程软件丨衡祖仿真
  20. 【计算机毕业设计】足球赛会管理系统

热门文章

  1. 【转】WPF入门教程系列六——布局介绍与Canvas(一)
  2. Dynamics 365 On-premises和Online 的不同
  3. Sharepoint学习笔记—Ribbon系列
  4. linux 或者xshell等工具输入错误命令 删除键显示^H 解决办法
  5. REVERSE-PRACTICE-BUUCTF-27
  6. 【NC140 排序】手写快速排序
  7. 【LeetCode1046】最后一块石头的重量(堆heap)
  8. 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)
  9. 【HDU - 5934】Bomb (强连通分量Tarjan + 缩点)
  10. 2.1)深度学习笔记:深度学习的实践层面