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

💞💞 前言

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.结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式深度剖析】【2】【行为型】【命令模式】| 以打开文件按钮、宏命令、图形移动与撤销为例加深理解

&#x1f448;️上一篇:模板方法模式 | 下一篇:职责链模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 命令模式定义英文原话直译如何理解呢&#xff1f; 四个角色1. Command&#xff08;命令接口&#xff09;2. ConcreteCommand&#xff08;具体命令类&…

linux进程间通讯指南-打通IPC大门,高效沟通无阻

在现代操作系统中&#xff0c;进程就像独立的个体&#xff0c;有时需要相互合作、数据共享&#xff0c;这就要求进程间能够高效通信。本文将为你揭开Linux进程间通信(IPC)的神秘面纱&#xff0c;探讨各种IPC工具的运作原理&#xff0c;同步机制的重要性&#xff0c;以及如何规避…

Ubuntu安装cuda

文章目录 前言一、安装NVIDIA驱动1.1 过程中的问题1.2 解决方法1.3 重启后出现 perform MOK management 二、安装Cuda2.1 检查是否安装显卡驱动2.2 安装Cuda2.3 验证CUDA是否安装成功 三、配置环境变量---未完2.4 图片居中加调整大学 总结 #pic_center 前言 只是为方便学习&…

淘宝扭蛋机源码解析:功能实现与技术细节

随着在线购物和娱乐的融合&#xff0c;淘宝扭蛋机作为一种创新的购物娱乐方式&#xff0c;受到了广大用户的喜爱。本文将深入解析淘宝扭蛋机的源码&#xff0c;探讨其功能实现与技术细节&#xff0c;以期为开发者们提供一些有价值的参考。 一、功能实现 1.用户登录与注册 淘宝…

win11通过网线分享网络到Ubuntu工控机

1.条件&#xff1a;一个能无线联网的win11&#xff0c;一根网线&#xff0c;一台Ubuntu工控机&#xff0c;并且使用网线连接两者 2.在win11电脑上 2.1 打开控制面板的网络和Internet 2.2 进入网络和共享中心&#xff0c;在左侧进入 更改适配器设置 2.3 在WLAN上右键&#xff0…

R语言数据探索和分析21-中国GDP及其影响因素多元线性回归分析

一、研究背景和意义 GDP 是宏观经济中最受关注的经济统计数字&#xff0c;目前我国国内生产总值年均增长率均明显高于同期美、日等发达经济体和巴 西、俄罗斯、南非、印度等其他金砖国家&#xff0c;成为世界经济增长的主力军&#xff0c;GDP 的增长对一个国家有着十分重要的意…

TSINGSEE青犀视频:城市道路积水智能监管,智慧城市的守护者

随着城市化进程的加快&#xff0c;城市道路网络日益复杂&#xff0c;尤其在夏季&#xff0c;由于暴雨频发&#xff0c;道路积水问题成为影响城市交通和市民生活的重要因素之一。传统的道路积水监测方式往往依赖于人工巡逻和简单的监控设备&#xff0c;这些方法存在效率低下、响…

软信天成:告别数据脏乱差!企业数据清洗实战方案分享

低质量数据普遍存在。据统计&#xff0c;数据质量问题每年给企业造成高达3.1万亿美元的损失。为了防范这种损失&#xff0c;越来越多的企业采用数据清洗来清洗数据&#xff0c;提高数据质量。 数据清洗&#xff0c;顾名思义是将数据上“脏”的部分清洗掉&#xff0c;让数据变得…

读《淘宝技术这10年》:从进化中感受技术的美与挑战

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个29岁的程序员,喜欢分享技术干货。今天,我想和大家聊一聊我最近读的一本书——《淘宝技术这10年》。这本书让我深刻领悟…

JetBrains PhpStorm 激活码限时特惠 7.1 折快抢!

各位程序员&#xff0c;每天敲代码真的需要一款好用的 IDE&#xff0c;大名鼎鼎的 JetBrains 值得信赖&#xff01;PHP 开发看过来&#xff0c;PhpStorm 个人版首年订阅 618 限时特惠 7.1 折&#xff0c;有需要的朋友一定不要错过&#xff01; PhpStorm 汇集了众多效率功能和集…

【微信小程序】网络请求

出于安全性方面的考虑&#xff0c;小程序官方对数据接口的请求做出了如下两个限制&#xff1a; 只能请求HTTPS类型的接口必须将接口的域名添加到信任列表中 登录微信小程序管理后台->开发->开发设置->服务器域名->修改request合法域名。 注意事项&#xff1a; 域…

视频汇聚EasyCVR安防监控系统GA/T 1400协议视图库对接:技术实现与应用

随着信息技术的不断发展&#xff0c;各类协议标准在各个领域得到了广泛应用。GA/T1400协议作为公安视频监控系统中的一种重要标准&#xff0c;对于提升公安工作的信息化水平、加强社会治安防控具有重要意义。本文将重点探讨GA/T1400协议视图库对接的技术实现及应用价值。 一、…

领菲linfeeLNF96E多功能电力仪表智能数码液晶显示三相电压电流表

品牌 LINFEE 型号 LNF96E 货号 LNF96E 产地 中国大陆 省份 江苏省 地市 无锡市 装修及施工内容 安装工程 电源电路 交流电表 电表类型 多功能电度表 颜色分类 LNF96E-C,LNF96E-CM,LNF96E-CJ,LNF96E-CK,LNF96E-CJK,LNF96E-CMJK 多功能电力仪表,LNF96E三相多…

c语言练习:POJ 1003 宿醉(HangOver)

为什么写这篇文章 作为一名计算机相关方向的学生&#xff0c;本人的代码能力却十分差劲&#xff0c;这不能不让人万分羞愧。于是&#xff0c;决定从此好好学代码&#xff0c;每天坚持刷题。而C语言是计算机程序语言的基础&#xff0c;遂决定从c语言开始&#xff0c;提高自身编…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:中国舰船研究院

中国舰船研究院又称中国船舶重工集团公司第七研究院&#xff0c;隶属于中国船舶重工集团公司&#xff0c;是专门从事舰船研究、设计、开发的科学技术研究机构&#xff0c;是中国船舶重工集团公司的军品技术研究中心、科技开发中心&#xff1b;主要从事舰船武器装备发展战略研究…

图神经网络实战(12)——图同构网络(Graph Isomorphism Network, GIN)

图神经网络实战&#xff08;12&#xff09;——图同构网络 0. 前言1. 图同构网络原理2. 构建 GIN 模型执行图分类2.1 图分类任务2.2 PROTEINS 数据集分析2.3 构建 GIN 实现图分类2.4 GCN 与 GIN 性能差异分析 3. 提升模型性能小结系列链接 0. 前言 Weisfeiler-Leman (WL) 测试…

解决vscode终端不显示conda环境变量名称问题【详细步骤!实测可行!!】

最近在使用Visual Studio Code (VSCode) 时候&#xff0c;发现终端没有正确显示激活的conda环境名称&#xff0c;搜了一下&#xff0c;找到原因&#xff0c;记录一下&#xff0c;如果有人也遇到同样的问题&#xff0c;可以收藏一下。   分别两种情况&#xff0c;一是windows系…

GaussDB技术解读——GaussDB架构介绍(一)

目录 1 GaussDB 关键架构目标 2 GaussDB分布式架构 2.1 GaussDB 分布式关键技术架构 3 数据计算路由层&#xff08;Coordinator&#xff09;关键技术方案 3.1 分布式优化器 3.2 分布式执行框架 GaussDB是华为自主创新研发的关系型数据库&#xff0c;基于华为在数据库领域…

Python编程学习第一篇——制作一个小游戏休闲一下

到上期结束&#xff0c;我们已经学习了Python语言的基本数据结构&#xff0c;除了数值型没有介绍&#xff0c;数值型用的非常广&#xff0c;但也是最容易理解的&#xff0c;将在未来的学习中带大家直接接触和学习掌握。后续我们会开始学习这门语言的一些基础语法和编程技巧&…

C++候捷stl-视频笔记4

一个万用的hash function 哈希函数的形式&#xff0c;一种是一般函数(右边)&#xff0c;一种是成员函数(左边)&#xff0c;类的对象将成为函数对象 具体做法例子。直接把属性的所有hash值加起来&#xff0c;会在hashtable中会产生很多的碰撞&#xff0c;放在同一个bucket中的元…