码迷,mamicode.com
首页 > 其他好文 > 详细

STL学习——Stack/Queue篇

时间:2016-05-07 09:43:58      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

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源码

STL学习——Stack/Queue篇

标签:

原文地址:http://blog.csdn.net/yzhang6_10/article/details/51335210

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!