STL学习——Stack/Queue篇

STL学习——Stack/Queue篇

Stack

  • 概述

    stack是一种先进先出的数据结构,只有一个出口,stack允许新增元素,移除元素,取得最顶端元素。但除了最顶端外,没有任何办法可以存取stack其他元素。即不允许遍历行为。

  • 实现

    stack实现是以容器为底部结构的,将容器的接口改变,使其符合“先进先出”特性,便形成了一个栈。具体实现可以将底部deque的头端开口封闭,便实现了stack。因为stack具有“修改某物接口,形成另一种风貌”性质,故称为“适配器”。stack被归类为container adapter。

    stack中没有迭代器,不提供走访功能。此外,stack还可以使用list作为底层容器。下面是stack的源码分析。

    template <class _Tp, class _Sequence>
    class stack {
    ...
    public:
      typedef typename _Sequence::value_type      value_type;
      typedef typename _Sequence::size_type       size_type;
      typedef          _Sequence                  container_type;
    
      typedef typename _Sequence::reference       reference;
      typedef typename _Sequence::const_reference const_reference;
    protected:
      _Sequence c;        // 底层容器
    public:
      // 以下完全利用Squence c操作,完成stack的操作
      stack() : c() {}
      explicit stack(const _Sequence& __s) : c(__s) {}
      // 判断栈空操作
      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(); }
      // 压栈操作
      void push(const value_type& __x) { c.push_back(__x); }
      // 弹栈操作
      void pop() { c.pop_back(); }
    };
    // 栈相等操作
    template <class _Tp, class _Seq>
    bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
    {
      return __x.c == __y.c;
    }
    // 栈小于操作
    template <class _Tp, class _Seq>
    bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
    {
      return __x.c < __y.c;
    }
    ...
    

Queue

  • 概述

    queue是一种先进先出的数据结构。它有两个出口。它允许新增元素,移除元素,从最底端加入元素,取得最顶端元素。除了从最底端加入元素,最顶端去除元素外,没有任何方法存取queue其他元素。即它也不存在遍历操作。

  • 实现

    queue也是以容器为底部结构,改变其接口,使其符合先进先出特性,形成queue。其实现可以将deque的低端出口和前端入口封闭,便可轻易实现queue。queue也具有“修改某物接口,形成另一种风貌”性质,故也为配接器。它也被归为容器适配器。它也不存在迭代器,故也不能执行遍历操作。下面是queue的源码分析。

    template <class _Tp, class _Sequence>
    class queue {
    ...
    public:
      typedef typename _Sequence::value_type      value_type;
      typedef typename _Sequence::size_type       size_type;
      typedef          _Sequence                  container_type;
    
      typedef typename _Sequence::reference       reference;
      typedef typename _Sequence::const_reference const_reference;
    protected:
      _Sequence c;            // 底层容器
    public:
      queue() : c() {}
      explicit queue(const _Sequence& __c) : c(__c) {}
      // 判断队列是否为空
      bool empty() const { return c.empty(); }
      // 计算队列的长度
      size_type size() const { return c.size(); }
      // 返回队首元素
      reference front() { return c.front(); }
      const_reference front() const { return c.front(); }
      // 返回队尾元素
      reference back() { return c.back(); }
      const_reference back() const { return c.back(); }
      // deque是两头可进出,queue是末端进,前端出(所有先进者先出)
      // 入队操作
      void push(const value_type& __x) { c.push_back(__x); }
      // 出队操作
      void pop() { c.pop_front(); }
    };
    // 判断队列是否相等
    template <class _Tp, class _Sequence>
    bool
    operator==(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
    {
      return __x.c == __y.c;
    }
    // 判断队列大小
    template <class _Tp, class _Sequence>
    bool
    operator<(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
    {
      return __x.c < __y.c;
    }
    ...
    
  • 参考文献

    STL源码剖析——侯捷

    STL源码

时间: 2024-08-24 16:30:36

STL学习——Stack/Queue篇的相关文章

C++ STL学习——stack

栈是最为常用的数据结构了,很多算法都是依靠栈来实现的,比如递归.我们要手动来实现栈,显得十分繁琐和麻烦,而且复用性不好.C++ 的STL中已经帮我们封装好了栈,我们只要方便的进行调用即可.该篇博客主要介绍STL 中stack的使用,stack应该说是STL中最简单的容器了.实例代码上传至  https://github.com/chenyufeng1991/STL_stack . (1)首先引入头文件 #include <stack>   .并使用命名空间:using namespace st

STL之stack,queue,优先队列

 1.stack,size(),empty(),pop()函数 #include<stack> #include <iostream> using namespace std; //通过push()方法入栈 //通过size()方法求栈中元素的个数 //通过empty()方法判断栈是否为空 //通过pop()求栈中最顶端的元素 void main() { int num; cin >> num; stack<int> mystack; for (; nu

[STL][C++]STACK QUEUE

参考:http://www.cnblogs.com/mfryf/archive/2012/08/09/2629992.html stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque.定义stack 对象的示例代码如下:stack<int> s1;stack<string> s2;stack 的基本操作有:入栈,如例:s.push

C++ STL学习——queue

我们在上一篇博客中<C++ STL学习--stack>简单介绍了STL 中stack这种数据结构的使用,这篇博客主要来讲一下queue队列的使用.其实queue的使用和stack一样简单.示例代码上传至 https://github.com/chenyufeng1991/STL_queue . (1)首先要引入头文件  #include <queue> . 并使用命名空间  using namespace std; (2)同stack一样,queue也不能使用迭代器.因为queue

STL学习_配接器篇

STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato

STL学习——Priority_queue篇

STL学习--Priority_queue篇 概述 priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能.因为它是queue,故只允许底端加入元素,顶端取出元素.priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列.权值最高者,排在最前面. 实现 priority_queue利用max_heap和vector表现的完全二叉树实现.它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单.默认情况,使用vect

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

STL学习——Vector篇

STL学习--Vector篇 vector简介 vector的数据安排及操作方式与array非常相似,两者的区别在于空间运用的灵活性.array是静态空间,一旦配置了,就不能改变:要换个大(或小)一点的可以,但琐碎的事由客户端完成:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统.而vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素.它对内存的合理利用和灵活运用有很大的帮助. vector实现关键技术:对大小的控制以及重新配置时的数据移动效率

STL学习_List篇

STL学习--List篇 简介 List与Vector不同,它不使用连续空间,而是每次插入或删除一个元素,就配置或释放一个元素空间.故list对空间的使用精准,不浪费任何空间.list对任何位置的元素插入或删除,常数时间完成. List与Vector的使用,视元素的多少,元素的构造复杂度,元素存取行为的特性而定. List节点 List本身与List节点不同,List是一个双向的链表.其节点信息如下: struct _List_node_base { _List_node_base* _M_ne