适配器stack和queue

目录

什么是适配器

模拟实现stack

stack的特性

STL中stack的基本框架

接口实现

模拟实现queue

queue的特性

STL中queue的框架


什么是适配器

适配器:所谓适配,适配的是容器(vector,list,deque....)

也就是不管是什么容器,都可以套用适配器,正因如此,所以我们在编写适配器时需要一个模板参数来接收容器

模拟实现stack

stack的特性

stack:栈,具有后进先出的特性

我们可以把栈看成一个桶,我们往这个桶里放了许多的东西,当我们要取最底下的东西时,要把桶顶上的物品先拿走,如果脱离了这个性质那么这个就不是桶了

同样的如果我们要取栈底的数据时,我们需要先取出压住这个数据的数据

 栈的插入和删除只能在一端进行,我们把这一端叫做栈顶

 我们依次往里面插入一些数据试试,依次插入:1,2,3,4,5,6

插入后如图

 此时如果我们要取出最底下的1,就需要把上面的6,5,4,3,2都移走

STL中stack的基本框架

在STL中,stack是一个适配器,也就是无论我们使用list还是vector不管使用什么容器,只要能符合栈的性质,就是一个栈

注意:需要容器支持stack所调用的那些接口才可以

STL中,在模板中加入了一个模板参数为容器模板(container)

通常我们都把stack的模板容器的缺省值设置为deque,原因是deque尾插尾删效率都很高,并且deque的空间浪费不会太大

deque的具体介绍

template<class T,class Container = deque<int>>
class stack
{
    public:
    //接口实现
    private:
        Container _con;
};

且stack的构造/析构函数不需要显示写,会自动调用容器的构造/析构函数 

接口实现

stack的接口都是复用容器的接口

template<class T , class Container = deque<int>>
class stack
{
    public:
        bool empty() const//判空
        {
            return _con.empty();
        }
        size_t size() const//返回大小
        {
            return _con.size();
        }
        T& top()//返回栈顶的数据,也就是最近一次插入的数据
        {
            return _con.back()
        }
        const T& top()const
        {
            return _con.back();
        }
        void push (const T& x)//插入从尾部插入对于所有容器都支持
        {
            _con.push_back(x)
        }
        void pop()
        {
            _con.pop_back();//尾上插入的就尾删,栈只支持一端插入删除
        }
    private:
        Container _con;
};

模拟实现queue

queue的特性

queue我们一般叫做队列,它具有先进先出的性质

如图

 通常

我们把插入的一端叫做队尾

删除的一端叫做队头

如果我们依次插入一段数据,1、2、3、4、5、6、7

 那么此时删除的顺序就是:1,2,3,4,5,6,7依次删除

STL中queue的框架

queue跟stack一样也是容器适配器,那么就需要有一个容器模板参数

template<class T,class Container = deque<int>>
class queue
{
    public:
    //接口实现
    private:
        Container _con;
};

注意:队列的容器不能使用vector,原因是队列是需要进行头删的,但vector没有头删

接口实现

template<class T,class Container = deque<int>>
class queue
{
    public:
        //队尾插入
        void push(const T& x)
        {
            _con.push_back();
        }
        //队尾删除
        void pop()
        {
            _con.pop_back();
        }
        //判空
        bool empty()
        {
            return _con.empty();
        }
        size_t size()
        {
            return _con.size();
        }
        //队头数据
        const T& front()
        {
            return _con.front();
        }
        T& front()
        {
            return _con.front();
        }
        //队尾数据
        const T& back()
        {
            return _con.back();
        }
        T& back()
        {
            return _con.back();
        }
    private:
        Container _con;
};

这期内容比较少,因为只讲了干货,那这期就到这了,感谢大家的支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值