【c++】模拟实现stack和queue

全部代码

#pragma once
#include<deque>
using namespace std;

namespace hqj
{
    template<class T, class Con = deque<T>>

    class stack
    {
    public:
        stack()
            :_c()
        {}

        void push(const T& x)
        {
            _c.push_back(x);
        }

        void pop()
        {
            _c.pop_back();
        }

        T& top()
        {
            return _c.back();
        }

        const T& top()const
        {
            return _c.back();
        }

        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty();
        }

    private:

        Con _c;

    };
 }
  • 队列

    template<class T, class Con = deque<T>>

    class queue
    {

    public:

        queue()
            :_c()
        {}
       void push(const T& x)
        {
            _c.push_back(x);
        }
    

        void pop()
        {
            _c.pop_front();
        }

        T& back()
        {
            return _c.back();
        }

        const T& back()const
        {
            return _c.back();
        }

        T& front()
        {
            return _c.front();
        }

        const T& front()const
        {
            return _c.front();
        }

        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty();
        }

    private:

        Con _c;
    };
}

栈的模拟实现

模板参数

  • 选择deque作为栈的底层容器

template<class T, class Con = deque<T>>

私有成员

  • 一个容器对象_con

Con _c;

构造函数

  • 因为_c是个容器对象,自身有构造函数,构造stack时会自动调用_C的构造函数,所以我们可以不写

 stack()
            :_c()
        {}

push函数

  • 栈的特点为栈顶入栈、栈顶出栈

  • 我们之间使用容器对象_c的尾插函数便可以实现栈的入栈

 void push(const T& x)
        {
            _c.push_back(x);
        }

pop 函数

  • 栈的特点为栈顶入栈、栈顶出栈

  • 我们之间使用容器对象_c的尾删函数便可以实现栈的出栈

        void pop()
        {
            _c.pop_back();
        }

top函数

  • 栈顶恰恰是底层容器的末元素,我们直接调用底层容器_c的back函数即可

  • 提供两个版本,一个是const、另一个是非const

        T& top()
        {
            return _c.back();
        }

        const T& top()const
        {
            return _c.back();
        }

size函数

  • 底层容器中有多少数据就代表栈有多少数据,直接复用底层容器_c的size

        size_t size()const
        {
            return _c.size();
        }

判空函数

  • 底层容器不为空栈也就不为空,还是直接复用底层容器_c的empty

        bool empty()const
        {
            return _c.empty();
        }

队列

构造函数

  • 队列也是容器适配器的玩法,直接调用底层容器_C的构造函数

 queue()
            :_c()
        {}

模板参数

  • 选择deque作为队列的底层容器

template<class T, class Con = deque<T>>

私有成员

  • 一个容器对象_con

Con _c;

push函数

  • 队列的特点是队尾入队,队头出队

  • 根据特点,我们调用底层容器的尾插函数即可

       void push(const T& x)
        {
            _c.push_back(x);
        }

pop函数

    • 队列的特点是队尾入队,队头出队

  • 根据特点,我们调用底层容器的头删函数即可

        void pop()
        {
            _c.pop_front();
        }

back函数

  • 该接口负责返回队尾元素

  • 而队尾恰恰是底层容器的末元素,直接复用底层容器的back函数

        T& back()
        {
            return _c.back();
        }

        const T& back()const
        {
            return _c.back();
        }

front函数

  • 该接口负责返回队头元素

  • 而队头恰恰是底层容器的首元素,直接复用底层容器的front函数

        T& front()
        {
            return _c.front();
        }

        const T& front()const
        {
            return _c.front();
        }

size函数

  • 底层容器有多少数据,该队列就有多少数据,依然是复用即可

        size_t size()const
        {
            return _c.size();
        }

empty函数

  • 底层容器不为空,队列便不为空,复用底层容器的判空函数

        bool empty()const
        {
            return _c.empty();
        }

总结

介绍栈和队列的模拟实现,之前有在C语言阶段实现过栈和队列,所以本文对栈和队列的结构不做解释。玩法是容器适配器玩法,底层容器选择的是双端队列,这是一种又像数组又像链表的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值