【STL源码剖析】第四章 序列式容器 之 stack和queue底层实现

stack

stack概述

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

将新元素推入stack的操作称为push,将元素推出stack的操作称为pop。

stack定义完整列表

以某种既有容器作为底部结构,将其接口改变,使之符合“先进先出”的特性,形成一个stack,是很容易做到的。deque是双向开口的数据结构,若以deque为底部结构并封闭其头端开口,便轻而易举地形成一个stack。因此,SGI STL便以deque作为缺省情况下的stack底部结构 ,stack的实现因而非常简单,源代码十分简短。

  
  template<class T, class Sequence = deque<T> >  
  class stack{  
      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() {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() {c.pop_back() ;}  
  } ;  

stack没有迭代器

stack所有元素的进出都符合“先进先出”的条件,只有stack顶端的元素,才有机会被外界取用。stack不能提供走访功能,也不提供迭代器。

以list作为stack的底层容器

除了deque之外,list也是双向开口的数据结构。上述stack源代码中使用的底层容器的函数有empt,size,back,push_back,pop_back,凡此种种,list都具备。因此,list为底部结构并封闭其头端开口,一样能够轻而易举形成一个stack。

  
  #include<stack>  
  #include<list>  
  #include<algorithm>  
  #include <iostream>  
  using namespace std;  
    
  int main(){  
      stack<int, list<int>> istack;  
      istack.push(1);  
      istack.push(3);  
      istack.push(5);  
        
      cout << istack.size() << endl; //3  
      cout << istack.top() << endl;//5  
      istack.pop();  
      cout << istack.top() << endl;//3  
      cout << istack.size() << endl;//2  
    
      system("pause");  
      return 0;  
  }  

queue

queue概述

queue是一种先进先出(First In FirstOut,FIFO)的数据结构,它有两个出口。queue允许新增元素、移除元素、从最底端加入元素、取得最顶端元素,但不允许遍历行为。

queue定义完整列表

SGI STL以deque作为缺省情况下的queue底部结构。

  
  template<class T, class Sequence = deque<T> >  
  class queue{  
        
  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的操作,完成queue的操作  
      bool empty() const {return c.empty();}  
      size_type size() const {return c.size();}  
      reference front() const {return c.front();}  
      const_reference front() const {return c.front();}  
      //deque是两头可进出,queue是末端进,前端出。  
      void push(const value_type &x) {c.push_back(x) ;}   
      void pop() {c.pop_front();}  
  } ;  

queue没有迭代器

queue所有元素的进出都必须符合“先进先出”的条件,只有queue顶端的元素,才有机会被外界去用。queue不提供遍历功能,也不提供迭代器。

以list作为queue的底层迭代器

  #include<queue>  
  #include<list>  
  #include<algorithm>  
  #include <iostream>  
  using namespace std;  
    
  int main(){  
      queue<int, list<int>> iqueue;  
      iqueue.push(1);  
      iqueue.push(3);  
      iqueue.push(5);  
        
      cout << iqueue.size() << endl; //3  
      cout << iqueue.front() << endl;//1  
      iqueue.pop();  
      cout << iqueue.front() << endl;//3  
      cout << iqueue.size() << endl;//2  
    
      system("pause");  
      return 0;  
  }  

猜你喜欢

转载自blog.csdn.net/u012940886/article/details/80531114