C++ stack queue模拟实现

news2025/1/12 3:57:53

       

目录

        一.stack

        二.queue

        三.deque


        STL中有6大组件,我们前面讲的string/vector/list是容器,还有迭代器,以及算法(比如find,swap,reverse,sort,merge函数),仿函数空间配置器会在后面讲解,下面讲的stack和queue是配接器

        一.stack

        stack就是数据结构中的栈,数据是先进后出。配接器是对特定类封装作为其底层的容器,提供函数来访问元素。简单来说栈的成员变量就是一个容器类,可以是vector也可以是list,因为这两种容器都支持栈的数据插入和删除。实现比较简单,只需要调用容器的接口即可,理解了栈就能理解调用函数的作用。

    template<class T, class Con = deque<T>>//模板参数,T是数据类型,Con是容器,默认是deque,这个数据结构后面讲
    class stack
    {
    public:
        stack()
        {
            Con _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();//const版本
        }

        size_t size()const
        {
            return _c.size();//输出当前栈里有多少个元素
        }

        bool empty()const
        {
            return _c.empty();//判断栈是否为空
        }

    private:
        Con _c;//成员变量就是容器
    };

        二.queue

        queue就是数据结构的队列,和栈不一样,队列的数据是先进先出,也是一种配接器,成员变量也是容器,和栈一样自身的函数接口都是调用容器的接口。但是容器不能是vector,因为先进先出的实现需要在删除时删去第一个元素,对于vector头删的时间复杂度很高,不仅需要挪动数据,在大量删除的场景下性能十分低下。实现也比较简单。

    template<class T, class Con = deque<T>>//模板参数,T是数据类型,Con是容器,默认是deque,这个数据结构后面讲
    class queue
    {
    public:
        queue()//默认构造函数
        {
            Con _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();//const版本
        }

        T& front()
        {
            return _c.front();//返回队列的头部元素
        }

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

        size_t size()const
        {
            return _c.size();//返回队列当前元素个数
        }

        bool empty()const
        {
            return _c.empty();//判断队列是否为空
        }

    private:
        Con _c;//成员变量就是容器
    };

        三.deque

        vector支持下标随机访问但不支持头插头删,或者说性能很低,list头插头删效率都极高,中间插入效率也高,但是不支持下标随机访问。而deque既支持下标随机访问,头插头删效率也比较高,可以说是结合了vector和list优点。

        deque是有一个存放数组指针的数组,每个数组指针指向一个数组,用来存放元素,相比于vector头插头删就不需要挪动数据,效率很高,相比于list空间利用率高,list是一块一块的占用内存,导致会出现比较多的内存碎片。

        双端队列实际上是分段连续的,为了实现能随机访问其迭代器比较复杂。

        但是deque终究还是不能取代vector和list,因为它不适合遍历,遍历时迭代器需要频繁检测是否移动到某段小空间的边界,导致效率低下,遍历线性结构还是适合vector和list。所以它适合栈和队列这种只进行头部尾部插入删除而不遍历的数据结构,而且相比list,deque的内存使用率也高。

        以上就是STL中stack和queue的模拟实现了,这章主要还是熟悉stack和queue的使用,以及了解双端队列deque。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 基础篇】Java Stream 流详解

Java Stream&#xff08;流&#xff09;是Java 8引入的一个强大的新特性&#xff0c;用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据&#xff0c;可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

bootstrapv4轮播图去除两侧阴影及线框的方法

文章目录 前言一、前提条件&#xff1a;二、bootstrap文档组件展示与实际应用1.官方文档展示如下&#xff1a;没有阴影2.实际应用情况如下&#xff1a; 三、解决方案 前言 这篇文章主要介绍了bootstrapv4轮播图去除两侧阴影及线框的方法,本文通过示例代码给大家介绍的非常详细…

基于微信小程序的项目申报管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

vtk- 数据类型(一) 三角链实例代码

三角链实例代码 #include <iostream> #include <string> #include <regex> #include "tuex.h" #include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkRendere…

Java --- MySQL8数据库优化性能查看工具

目录 一、数据库服务器优化步骤 ​编辑二、查看系统性能的参数 三、统计SQL的查询成本&#xff1a;last_query_cost 四、定位执行慢的SQL&#xff1a;慢日志查询 4.1、开启并设置慢查询日志查询参数 4.2、查看慢查询数目 4.3、慢查询日志分析工具&#xff1a;mysqldumps…

MySQL单表查询和多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10)…

帆软FineReport决策报表之页面布局

最近在用帆软决策报表绘制首页大屏&#xff0c;记录使用过程&#xff0c;方便查看。 版本&#xff1a;FineReport10.0 第一步、页面布局 页面布局其实就是组件的排列组合&#xff0c;决策报表主区域body有两种布局方式&#xff1a;自适应布局和绝对布局。 1&#xff09;自适应…

C#中实现单元测试的示例流程_MSTest测试项目

一、单元测试简介 1.1、单元测试简介 在《单元测试艺术》一书中对于单元测试的定义是&#xff1a;【一个单元测试是一段代码&#xff0c;这段代码调用一个工作单元&#xff08;指&#xff1a;调用软件中的一个方法&#xff0c;这个方法执行过程中所发生的所有行为以及最后产生…

你好,python!——python基础中的基础

〇、注释 0.1 单行注释 python中用 “# ”来给某一行注释&#xff0c; 他的快捷键是 CTRL / &#xff0c;当注释内容已被注释时&#xff0c;会解除注释 0.2 多行注释 python中用 """ 注释内容 """ 来对内容进行多行注释 ""&q…

DATE和LocalDateTime在Java中有什么区别

在Java中&#xff0c;Date和LocalDateTime是两个表示日期和时间的类&#xff0c;它们有以下区别&#xff1a; 类型&#xff1a;Date是Java旧版提供的日期和时间类&#xff0c;而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性&#xff1a;Date是可变类&#x…

Questasim与Visualizer的livesim仿真

1.前言 Live-Simulation (live-sim)模式允许Visualizer调试环境与Questasim进行交互操作&#xff0c;此模式将Visualizer GUI与Questasim仿真相结合&#xff0c;因此可以在线调试当前仿真的结果和波形。在livesim模式中&#xff0c;可以在Visualizer GUI中控制仿真、设置断点(…

【Java 基础篇】Java 类加载器详解

在Java编程中&#xff0c;类加载器&#xff08;Class Loader&#xff09;是一个重要的概念&#xff0c;它负责将类加载到Java虚拟机中&#xff0c;使程序能够正常运行。本文将详细解释Java类加载器的工作原理、不同类型的类加载器以及如何自定义类加载器。 什么是类加载器&…

智慧公厕以数字技术为中心,融合数字管理技术与城市治理需求精准对接

现代城市的发展离不开科技的进步&#xff0c;智慧公厕作为城市治理的重要方面之一&#xff0c;正逐渐受到越来越多的重视。智慧公厕以数字技术为中心&#xff0c;融合数字管理技术与城市治理需求精准对接&#xff0c;为城市居民提供更加方便、舒适的公共卫生设施。本文将以智慧…

2023年7月嵌入式项目开发专题总汇

一、前言 当前文章总结了28个基于不同单片机&#xff08;51单片机和STM32&#xff09;设计的软件和硬件项目。这些项目涵盖了计算器、手机、酒精检测仪、环境温度与湿度检测设备、考勤系统、门禁照相机、人体健康检测仪、数码相册、太阳能热水器、数显热水器和智能空调等多个领…

高性能计算环境下的深度学习异构集群建设与优化实践

★深度学习&#xff1b;模式识别&#xff1b;图像处理&#xff1b;人工智能建模&#xff1b;人工智能&#xff1b;深度学习算法&#xff1b;强化学习&#xff1b;神经网络&#xff1b;卷积神经网络&#xff1b;人工神经网络&#xff1b;VIBE算法&#xff1b;控制系统仿真&#…

用Redis做数据排名

1.背景 用Redis做数据缓存用的比较多&#xff0c;大家都能熟练使用String和Hash结构去存储数据&#xff0c;今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据&#xff0c;可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做…

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类&#xff0c;具备参数管理功能。 例如&#xff1a; nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d, nn.Embedding nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTr…

2023华为杯数学建模D题第三问-碳排放路径优化(能源消费结构调整的多目标优化模型构建详细过程+模型假设(可复制))

1.碳排放约束下&#xff08;人为干预按时碳达峰与碳中和的基准情景&#xff09;能源消费结构多目标优化模型构建 1.1基本假设 本文的模型设计主要基于以下几个基本假设&#xff1a; &#xff08;1&#xff09;能源消费结构调整的根本驱动要素&#xff0c;是对投资耗费的最小化…

uni-app图片保存到手机

uni.saveImageToPhotosAlbum(OBJECT) 官网地址uni.chooseImage(OBJECT) | uni-app官网 注意filePath不能是网络图片路径&#xff0c;如果我们是网络图片路径需要先下载文件资源到本地&#xff0c;然后再保存到相册 // 保存图片到手机 const saveImg () > {//wx.downloadF…