【C++】STL:栈和队列模拟实现

news2024/11/15 10:57:27

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:C++入门至进阶
这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

目录

  • 💞💞 前言
  • 1.stack和queue简介
  • 2.stack模拟实现
    • ✨stack实现代码
    • ✨stack测试代码
  • 3.queue模拟实现
    • ✨queue实现代码
    • ✨queue测试代码
  • 4.结语

1.stack和queue简介

C++中的stack(栈)和queue(队列)是两种常见的数据结构,用于存储和管理数据。

是一种先进后出(LIFO)的数据结构,类似于我们平时堆叠的一摞书,只能在顶部进行操作。在C++中,可以使用std::stack模板类来创建栈。栈的主要操作包括压入(push)元素到栈顶、弹出(pop)栈顶元素以及获取栈顶元素等。

队列是一种先进先出(FIFO)的数据结构,类似于排队等候的人群,新元素插入队尾,最早插入的元素在队头。在C++中,可以使用std::queue模板类来创建队列。队列的主要操作包括插入(push)元素到队尾、删除(pop)队头元素以及获取队头元素等。

如下图所示:

在这里插入图片描述

stack和queue都有自己的特点和适用场景。栈常用于实现递归算法、表达式求值和括号匹配等问题,而队列常用于实现广度优先搜索(BFS)算法、任务调度和缓冲区管理等问题。

在C++中,stack和queue都是基于deque(双端队列)实现的,默认使用deque容器作为底层数据结构。此外,C++还提供了其他数据结构,如priority_queue(优先队列)和deque(双端队列),可以根据具体需求选择合适的数据结构来解决问题。

2.stack模拟实现

stack函数作用
push尾插(栈顶入栈)
pop尾删(栈顶出栈)
top获取栈顶元素(也就是尾部元素)
const top给const对象使用
size栈中元素个数
empty判断栈是否为空

stack模拟实现我们就可以使用之前学习过的vector或者list容器来实现,可以创建一个类模板,除了数据的类型可以改变,其使用的容器也可以改变,代码如下:

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

这样我们只需要传入数据类型以及使用的容器类型就可以确定stack是使用什么容器来实现存储和管理数据了🥳🥳,默认传入的是deque容器(给的是缺省值)

deque(双端队列)是C++标准库中的一种容器,它可以在两端进行插入和删除操作。deque的全称是double-ended queue,它融合了向量(vector)和双向链表(doubly linked list)的特性。

使用deque记得包含头文件#include<deque>

✨stack实现代码

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

namespace tutu_stack
{
    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;

    };
}

stack的构造,因为是使用STL标准库里的容器来实现,所以我们只需要调用标准库里给的构造函数即可,因为类的默认构造会自动调用自定义类型的默认构造,所以这里的默认构造可以不写,栈是使用标准库里的容器来存储数据的,所以不需要手动实现拷贝

✨stack测试代码

  //测试代码
    void test_stack()
    {
        stack<int,vector<int>> s;
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);

        while (!s.empty())
        {
            cout << s.top() << " ";
            s.pop();
        }
    }

注意测试代码要包含在自己的命名空间中哦,我们这里显示的将容器给了vector来存储数据,记得要包含vector的头文件#include<vector>

3.queue模拟实现

queue的实现与vector非常类似

queue函数作用
push队尾入队列
pop队头出队列
front获取队头元素
const frontconst对象使用
back获取队尾元素
const backconst对象使用
size获取队列元素个数
empty判断队列是否为空
swap交换两个队列

与stack类似,它也使用了类模板 template<class T, class Container = std::deque<T>>并给了缺省值,使用deque(双端队列),同样其构造函数也不需要写,直接调用自定义类型的默认构造即可,队列是使用标准库里的容器来存储数据的,所以不需要手动实现拷贝

✨queue实现代码

using namespace std;
#include<iostream>
#include<deque>
#include<vector>
#include<list>

namespace tutu_queue
{
        template<class T, class Container = std::deque<T>>
        class queue
        {
        public:
            //队尾入队列
            void push(const T& x)
            {
                _c.push_back(x);
            }

            //队头出队列
            void pop()
            {
                _c.pop_front();
            }

            //获取队头元素
            T& front()
            {
                return _c.front();
            }
            const T& front() const
            {
                return _c.front();
            }

            //获取队尾元素
            T& back()
            {
                return _c.back();
            }
            const T& back() const
            {
                return _c.back();
            }

            //获取队列中有效元素个数
            size_t size() const
            {
                return _c.size();
            }

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

            //交换两个队列中的数据
            void swap(queue<T, Container>& q)
            {
                _c.swap(q._c);
            }
        private:
            Container _c;
        };
    
}

✨queue测试代码


//测试代码
//使用list容器
    void test_queue2()
    {
        queue<int, list<int>> q;
        q.push(1);
        q.push(2);
        q.push(3);
        q.push(4);
        while (!q.empty())
        {
            cout << q.front() << " ";
            q.pop();
        }

    }

测试代码要在自己的命名空间里面,使用list容器记得要包头文件#include<list>

结果如下:
在这里插入图片描述

这里注意不能使用vector容器,因为vector没有pop_front()这个函数,除非使用erase删除第一个元素,但是这样需要挪动数据,效率很低,所以一般不使用vector作为容器

4.结语

栈和队列是常用的数据结构,可以使用数组或链表来实现,这里我们提了一种类模板,方便我们传入要实现的容器。使用栈和队列非常方便,它们具有高效的性能和覆盖各种操作的方法。可以根据需要调用相关函数来完成相关的操作。以上就是今天所有的内容啦~ 完结撒花~ 🥳🎉🎉

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

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

相关文章

spring boot sso

代码&#xff1a;https://gitee.com/forgot940629/ssov2 授权服务 登录成功后&#xff0c;session中会存储UsernamePasswordAuthenticationToken&#xff0c;之后每次请求code时都会用UsernamePasswordAuthenticationToken生成OAuth2Authentication&#xff0c;并将OAuth2Aut…

【远程连接服务器】—— Workbench和Xshell远程连接阿里云服务器失败和运行Xshell报错找不到 MSVCP110.d的问题分析及解决

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、远程连接不上服务器1. Workbench远程连接失败2.Xshell也连接不上3.解决方法(1)问题描述&#xff1a;(2)解决&#xff1a; 4.再次连接服务器 二、运行Xshell…

SpringBoot 基于jedis实现Codis高可用访问

codis与redis的关系 codis与redis之间关系就是codis是基于多个redis实例做了一层路由层来进行数据的路由&#xff0c;每个redis实例承担一定的数据分片。 codis作为开源产品&#xff0c;可以很直观的展示出codis运维成本低&#xff0c;扩容平滑最核心的优势. 其中&#xff0…

算法第三天力扣第69题:X的平方根

69. x 的平方根 (可点击下面链接或复制网址进行做题) https://leetcode.cn/problems/sqrtx/https://leetcode.cn/problems/sqrtx/ 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被…

【实战JVM】-实战篇-06-GC调优

文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…

GAT1399协议分析(六)--校时

一、官方消息定义 DeviceIDType &#xff1a;GA/T1400.1,采集设备、 卡口点位、 采集系统、分析系统、视图库、应用平台等设备编码规则 TimeCorrectModeType&#xff1a; dateTime时间格式&#xff1a; TimeZone&#xff1a;时区&#xff0c;GAT1400里面没有找到具体内容&…

大家都在用的4款超实用视频剪辑软件,快来码住自用吧!

随着自媒体行业的不断发展&#xff0c;不少小伙伴也逐渐步入了短视频的热潮。对于短视频制作来说&#xff0c;视频剪辑软件的选择非常重要。 如果剪辑软件不够好&#xff0c;整个视频就基本垮掉了。今天就给大家推荐4款好用的视频剪辑软件。 1.牛学长视频剪辑 推荐剪辑新手入门…

重复文件查找?6款电脑重复文件清理软件很靠谱!

在日常使用电脑过程中&#xff0c;很多人下载文件后常常会忘记它们的存在&#xff0c;导致同一份资料在系统中存在多个副本。虽然你可以手动删除 Windows 系统中的所有重复文件&#xff0c;但这样做很费时间&#xff0c;而且有可能会遗漏很多文件。 而且随着重复文件的不断累积…

树莓集团:引领摄影培训,打造行业人才培育高地

在当今数字化快速发展的时代&#xff0c;摄影技术作为文化创意产业的重要组成部分&#xff0c;其人才培养显得尤为重要。依托其深厚的产业背景和丰富教育资源的树莓集团&#xff0c;倾力打造一流的摄影培训体系&#xff0c;为行业输送源源不断的高素质人才。 树莓集团旗下的摄…

JAVA技术设计模式

设计模式结构图 设计原则 职责单一原则接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上 依赖倒置面向接口编程,参数或变量,依赖注入,使用父类 开闭原则 对扩展开放(对提供方),对修改关闭(对使用方) 用抽象构建框架,用实现扩展细节 里氏替换原则…

汇凯金业:贵金属交易规则有哪些

贵金属投资目前非常火热&#xff0c;许多投资者从中获得了可观的收益。新手投资者在进入贵金属市场及其交易之前&#xff0c;务必要了解清楚贵金属的交易规则。了解规则和差异能帮助新手更好地进行贵金属投资交易。下面我们以现货类贵金属为例&#xff0c;详细说明贵金属的交易…

【活动通知 — 线上 Meetup】:ES|QL 及 B 站 Elasticsearch 平台实践 - 6 月 19 日

会议时间 2024年6月19日 19:00 — 21:00 参与方式 线上直播&#xff1a;Elastic 中国社区官方博客&#xff0c;elasticstack B 站号。链接请参考下面的报名地址。 活动议程 19:00-19:50 主题演讲&#xff1a;Elasticsearch 简单而高效的管道查询语言 - ES|QL 讲师&#xff…

基于STC89C52单片机空气PM2.5系统设计资料

#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char //宏定义sbit RSP1^6;//液晶接口sbit ENP1^7;sbit LED P2^0;//粉尘传感器控制接口sbit ADCS P3^7;//AD0832接口sbit ADCLK P3^5;sbit ADDI P3^6;sbit ADDO P3^6;…

【已解决】Python报错 RuntimeError: No CUDA GPUs are available

本文摘要&#xff1a;本文已解决 Python FileNotFoundError 的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领…

使用cesiumLab使shp转为3dtlies

过程不做赘述&#xff0c;网上大把&#xff0c;说下注意事项。 1. 存储3DTiles 选项 若是打开则输出的文件为glb格式文件,因为glb文件好储存易传输跨平台。cesium可以使用但无法处理&#xff0c;例如改变颜色&#xff0c;改着色器等。若是不打开则输出的文件为bm3d格式文件,此…

网络运维简介

目录 1.网络运维的定义 2.诞生背景 3.网络运维的重要性 4.优点 5.缺点 6.应用场景 6.1.十个应用场景 6.2.数据中心运维 7.应用实例 8.小结 1.网络运维的定义 网络运维&#xff08;Network Operations&#xff09;是指管理、监控和维护计算机网络以确保其高效、安全和…

IDEA快捷生成左边变量,取消final关键字

一&#xff1a;问题 如图&#xff1a;每次使用CtrlALtV或.var自动生成左边变量都会有final关键字&#xff0c;然后需要删除很麻烦 二&#xff1a;解决 以下步骤设置取消生成final关键字 1.先 生成变量&#xff1a;我是使用.var自动生成左边变量 2.使用快捷键ALtshiftO或者点…

C#WPF数字大屏项目实战08--生产量/良品统计

1、区域划分 生产量/良品统计这部分位于第二列的第二行 2、livechart拆线图 定义折线图,如下: <lvc:CartesianChart> <lvc:CartesianChart.Series> <!--设置Series的类型为 Line 类型, 该类型提供了一些折线图的实现--> <lvc:LineSeries/>…

装饰器,状态管理和if判断(HarmonyOS学习第六课)

Builder装饰器-自定义构建函数 前面介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使方法进行数据传递。ArkUI还提供了一种更轻量的UI 元素复用机制Builder&#xff0c;Builder 所装饰的函数遵循build( )函数语法规则&#xff0c;开发者可以将重…

AutoMQ 生态集成 Tigris

Tigris[1]是一个全球分布式的兼容 S3 的对象存储服务&#xff0c;它允许你存储和访问任意数量的数据&#xff0c;具有广泛的使用场景。Tigris 会自动且智能地将数据分布到靠近用户的位置&#xff0c;让用户无需担心数据复制和缓存复杂性。 你可以将 Tigris 用于多种场景&#x…