queue源码

queue概述

queue是一种先进先出的数据结构,允许新增元素、移除元素,queue只允许从底端加入元素,从顶端移除元素,不允许有遍历行为。

queue定义

以某种既有容器作为底部结构,将其接口改变,使之符合"先进先出"的特性,形成一个queue,是很容易做到的,deque是双向开口的数据结构,若以deque以底端的出口以及前端的入口,便轻易举起形成一个queue。

由于queue系以底部容器完成其所有工作,而具有这种性质,称为adapter(配接器),因此,STL stack往往不被归类为container(容器),而被归类为container adapter。

template <class T,class Sequence=deque<T> >
class queue
{
    friend bool operator==__STL_NULL_TMPL_ARGS(const queue& x,const queue& y);
    friend bool operator<__STL_NULL_TMPL_ARGS(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:
    //以下利用Sequence(也就是deque)实现queue
    bool empty() const{return c.empty();}
    size_type size() const{return c.size();}
    reference front() const{return c.font();}
    const_reference front() const{return c.font();}
    reference back() const{return c.back();}
    const_reference back() const{return c.back();}
    
    void push(const value_type&){c.push_back(x);}
    void pop(){c.pop_front();}
};

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;
}

 

queue没有迭代器

queue是先进先出的数据结构,不允许遍历,所以queue不提供迭代器。

以list作为queue底层容器

除了deque之外,list也是双向开口的数据结构。上述queue源码中使用的底层容器的函数有empty、size、back、push_back、pop_back,list也都具备,因此,若以list为底部结构并封闭其头端开口,一样能够形成一个stack,示范如下:

#include<bits/stdc++.h>
using namespace std;

int main(){
    queue<int,list<int> > myqueue;
    myqueue.push(1);
    myqueue.push(3);
    myqueue.push(5);
    myqueue.push(7);
    cout<<myqueue.size()<<endl; //4
    cout<<myqueue.front()<<endl; //1;
    myqueue.pop(); cout<<myqueue.front()<<endl; //3
    myqueue.pop(); cout<<myqueue.front()<<endl; //5
    myqueue.pop(); cout<<myqueue.front()<<endl; //7
    cout<<myqueue.size()<<endl; //1
    return 0;
}

 

 

posted @ 2019-01-28 17:01  ybf&yyj  阅读(858)  评论(0编辑  收藏  举报