STL学习——Stack/Queue篇

本文深入探讨了STL中的Stack和Queue两种容器适配器的实现原理与使用方法。详细解析了这两种数据结构如何通过改变底层容器如deque的接口来实现特定的功能,并提供了源码级的解读。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值