C++ 详细讲解stack与queue的模拟实现

 更新时间:2022年04月15日 11:51:13   作者:m0_52012656  
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构,许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列

容器适配器

适配器是一种设计模式(设计模式是一套反复使用的、大部分人知道的代码设计经验的总结),该模式试讲一个类的接口转化为用户希望的另一个接口,虽然stack与queue中也可以存放元素,但在STL中并没有将其划分为容器,而是成为容器适配器,这是因为stack与队列只是堆其他容器进行了包装,STL中的stack和queue是使用双端队列进行封装的。

双端队列

概念

它是一种双开口的连续空间数据结构(与队列没有关系),双开口的含义是可以再两端进行插入删除操作,且时间复杂度为O(1),与vector比较,头插效率比较高,不需要移动数据,与list比较,空间利用率高。

结构

deque并不是真正的连续空间,而是使用一小段连续的小空间拼接而成,实际上deque类似于一个动态的二维数组,其底层结构如下图所示:

中控数组map: map数组是一个指针数组,指向多个buff数组用来储存数据,当buff数组头或尾满了,就新开辟一个buff数组,其指针存在map的相对应位置,当map数组满了,会对map数组扩容(指针数组的扩容并不会效率低)

deque迭代器

deque所谓的连续空间是一个假象,是他底层复杂的迭代器实现

STL源码:

typedef T** map_pointer;
T* cur;
T* first;
T* last;
map_pointer node
  • cur:是当前的node指向的buff数组当前指向的地址
  • first:是当前node指向的buff数组,第一个元素的地址。
  • last:是当前node指向的buff数组,最后一个元素的地址。
  • node:是指向当前map数组对应的指针,由于他指向的也是一个指针·,所以为二级指针。

优缺点

优点:

双端队列,说明他很合适头插头删,尾插尾删,他去做stack和queue的容器适配器很合适。

缺点:

双端队列中间插入删除非常麻烦,效率不高。

deque是一种折中的方案设计,随机访问效率不如vector,任意插入删除不及list

stack模拟

stack是一种容器适配器,专门在具有后进先出的上下文环境中,其删除只能是在一端进行操作。

stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出 。

stack的底层原理可以是任何标椎的容器类模板或者一些特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作。
  • back:尾部元素获取。
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作。

模拟实现

template<class T, class Con = deque<T>>
    class stack
    {
    public:
        stack();
        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;
    };
​

queue模拟实现

队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素

队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列

底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

模拟实现

template<class T, class Con = deque<T>>
    class queue
    {
        public:
            queue();
            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;
    };

 

到此这篇关于C++ 详细讲解stack与queue的模拟实现 的文章就介绍到这了,更多相关C++ stack与queue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现公司人事管理系统

    C++实现公司人事管理系统

    这篇文章主要为大家详细介绍了C++实现公司人事管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++调用matlab函数的实例

    C++调用matlab函数的实例

    这篇文章主要介绍了C++调用matlab函数的方法,包括封装matlab函数,编译matlab函数及C++环境配置,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C++将保存char、int 和double到txt文件中

    C++将保存char、int 和double到txt文件中

    这篇文章主要介绍了C++如何将保存char、int 和double到txt文件中,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言调用摄像头生成avi视频程序

    C语言调用摄像头生成avi视频程序

    这篇文章主要为大家详细介绍了C语言如何调用摄像头生成avi视频程序,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2023-11-11
  • C语言实现简单猜数字小游戏

    C语言实现简单猜数字小游戏

    这篇文章主要为大家详细介绍了C语言实现简单猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 如何将C++源程序改写为C语言

    如何将C++源程序改写为C语言

    C++中主要的与C的区别最大而且最常用的特性及修改方法,接下来我们一起来学习他们吧
    2021-08-08
  • Qt 多语言程序设计的实现

    Qt 多语言程序设计的实现

    本文主要介绍了Qt 多语言程序设计的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++ 使用PrintWindow实现窗口截图功能

    C++ 使用PrintWindow实现窗口截图功能

    这篇文章主要介绍了C++ 如何使用PrintWindow实现窗口截图功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Cocos2d-x UI开发之CCControlSlider控件类使用实例

    Cocos2d-x UI开发之CCControlSlider控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlSlider控件类使用实例,本文代码中包含大量注释讲解了CCControlSlider控件类的使用,需要的朋友可以参考下
    2014-09-09
  • linux之sort命令的用法

    linux之sort命令的用法

    sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
    2013-10-10

最新评论