STL:stack 与 queue

Posted 小键233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL:stack 与 queue相关的知识,希望对你有一定的参考价值。

好久没有写过新的内容了。主要是最近真的没有时间。

好吧,这次介绍一下栈与队列的内容。

stack

先理一下之前写过的容器:

  • vector
  • deque
  • list

这些都是序列式容器,但是使用了不同的数据结构来实现。

栈的特性,就是先进后出(或者后进先出)
一般来说,我们可以使用上面的容器来实现栈。

事实上,当你看到STL 中的设计时,才感叹,真是一种绝美的设计啊。

这次先从代码说起,它的全部代码都如下:


template<class T, class Sequence = deque<T> >
class stack

    friend bool operator == (const stack& x, const stack& y);
    friend bool operator < (const stack& x, const stack& y);
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;//container

public:
    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();
    

    void swap(stack& x)
    
        c.swap(x.c);
    
;

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;


template<class T, class Sequence>
void swap(stack<T, Sequence>& 
x, sta
ck<T, Sequence>& y)

    x.swap(y。。
;

代码并不长。
stack 接受两个模板参数,一个是元素的类型,另一个是底层实现的容器。

看命名,其实我们就能够知道,它接受一个序列式容器。
这个序列式容器,在承诺上应该提供以下接口

  • push_back
  • back
  • size
  • empty
  • pop_back

看到这里,也许你就能明白为什么vector 的push 接口非得带个back 了。

一个规范的接口命名真的太重要了。

废话有点多,下面说说queue。

queue

其实这个也是一个用底层容器来实现主要功能的类。
队列的规则是 先进先出(或者后进后出)

序列式容器中的 deque 就很适合这个实现。

所以,它的代码如下:


template<class T, class Sequence = deque<T> >
class queue

    friend bool operator == (const queue& x, const queue& y);
    friend bool operator < (const queue& x, const queue& y);

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:
    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(); 
    void push(const value_type& x)
    
        c.push_back(x);
    
    void pop()
    
        c.pop_front();
    

    void swap(queue& x)
    
        c.swap(x.c);
    
;

template<class T, class Sequence>
bool  operator == (const queue<T, Sequence>& x, const queue<T, Sequence>& y)

    return x.c == y.c;


template<class T, class Sequence>
bool operator < (const queue<T, Sequence>& x, const queue<T, Sequence>& y)

    return x.c < y.c;


template<class T, class Sequence>
void swap(queue<T, Sequence>& x, queue<T, Sequence>& y)

    x.swap(y);

也是很简单的一种实现。
过目就好。

它们没有迭代器

像是stack 和 queue 这种修改底层类的接口,从而达到自己类想要的功能,称之为配接器(adapter)

所以,它们是没有迭代器的概念的。

如果开心的话,你也可以实现一个类,按照规定,提供接口给它们,你就可以设计成自己的stack 和 queue 类的。

以上是关于STL:stack 与 queue的主要内容,如果未能解决你的问题,请参考以下文章

STL详解—— stack和queue的介绍及使用

[ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现

STL容器适配器 stack, queue

C++STL之stack和queue以及deque详解

C++STL之stack和queue以及deque详解

C++ stack&queue