STL容器适配器之stack、queue的基本用法及模拟实现

1.stack

在C++STL(标准模板库)中,栈被实现为一个容器适配器,提供了简化的接口,开发人员能够很轻松的使用栈数据结构。

1.1 特性

基于容器C++STL中的std::stack是一个容器适配器,它不是一个独立的数据结构,而是构建在其他容器之上的。默认情况下,std::stack使用std::deque作为其底层容器,但是也可以选择使用std::vector、std::list等其他容器来作为底层支持。

std::stack<int, std::deque<int>> stack1;  // 使用 std::deque 作为底层容器
std::stack<int, std::vector<int>> stack2; // 使用 std::vector 作为底层容器

1.2 C++ 标准库中的基本用法

std::stack提供了常用的栈操作,包括:push(val):将元素压入栈顶。pop():弹出栈顶元素。top():访问栈顶元素。empty():检查栈是否为空。size():返回栈的大小。具体用法如以下代码所示。

//stack--C++ 标准库中的基本用法
void test_stack()
{stack<int> stack;int sum(0);//1、push()--将元素压入栈中for (int i = 0; i < 10; ++i)stack.push(i);//2、size()--返回栈中元素的个数cout << stack.size() << endl;//3、emplace()--在栈顶部添加一个新元素,该元素位于其当前顶部元素的上方。stack.emplace(11);cout << stack.size() << endl;//4、empty()--判断栈是否为空//5、top()--返回栈顶元素的引用//6、pop()--将栈顶元素弹出while (!stack.empty()){//取栈顶的数据cout << stack.top() << " ";stack.pop();//栈顶元素出栈}cout << endl;cout << stack.size() << endl;
}

1.3 性能

std::stack的性能通常取决于其底层容器的性能特征。默认情况下,使用std::deque作为底层容器。选择不同的底层容器可能会影响性能。

使用std::vector作为底层容器:具有快速的随机访问性能,但在插入和删除元素时可能效率较低。使用std::list作为底层容器:具有快速的插入和删除性能,但随机访问较慢。因此,在选择底层容器时,需要根据具体的操作需求和性能考虑来进行权衡。

1.4 工作原理

关于栈的理论基础,可以看文章栈和队列的实现。

1.5 栈的模拟实现

本文演示了使用C++标准库提供的容器(std::deque)来实现一个栈,并提供了基本的栈操作。注意:实际的std::stack实现更加复杂和健壮。

1.5.1 push 方法

push方法用于将一个新元素压入栈顶。它调用容器的push_back方法将元素添加到底层容器_con的末尾。

void push(const T& val)
{_con.push_back(val);
}

1.5.2 pop方法

pop方法用于移除栈顶元素。在移除元素之前,它首先检查栈是否为空,如果不为空,则调用pop_back来移除末尾元素;如果为空,则抛出一个runtime_error异常。

void pop()
{if (!empty()){_con.pop_back();}else{throw std::runtime_error("Stack is empty.");}
}

1.5.3 top 方法

top方法返回对栈顶元素的引用。如果栈不为空,它返回底层容器最后一个元素的引用;如果栈为空,则抛出runtime_error异常。

T& top()
{if (!empty()){return _con.back();}else{throw std::runtime_error("Stack is empty.");}
}

1.5.4 empty 方法

empty方法用于检查栈是否为空。该函数返回一个布尔值,通过调用底层容器_con的empty方法得出。

bool empty ()
{return _con.empty();
}

1.5.5 size 方法

size方法返回栈中元素的数量。它通过调用底层容器_con的size方法来实现。

size_t size()
{return _con.size();
}

完成代码如下:

//新增一个容器的模板参数,T是数据的类型,
//Container是一个容器的类型(容器具体是什么类型,可以根据需要传入)。
template<class T,class Container=std::deque<T>>
class MyStack
{
public:void push(const T& val){_con.push_back(val);}void pop(){if (!empty()){_con.pop_back();}else{throw std::runtime_error("Stack is empty.");}}T& top(){if (!empty()){return _con.back();}else{throw std::runtime_error("Stack is empty.");}}size_t size(){return _con.size();}bool empty (){return _con.empty();}private:Container _con;
};

2.queue

2.1 特性

std::queue是STL中的一个容器,它提供了队列(FIFIO,即先进先出)的功能。

先进先出(FIFO):如同现实生活中的队列,std::queue中的元素被安排在一系列的顺序中,最先加入的元素会最先被移除。

封装:std::queue在底层容器的基础上提供了封装。默认情况下,std::queue使用std::deque作为其底层容器,但也可以配置为使用std::list或其他符合要求的容器。

简单的接口:std::queue提供了一组简单的接口来添加、移除元素以及访问队列的首尾元素。

2.2 性能

时间复杂度:入队和出队操作通常是常数时间复杂度(O(1)),这意味着操作的时间不会随着队列大小的增加而显著增加。

空间复杂度:由于std::queue使用底层容器来存储元素,其空间复杂度取决于所使用的底层容器。例如,使用std::dequeue时,空间复杂度通常是线性的(O(n)),其中n是队列中元素的数量。

2.3 C++ 标准库中的基本用法

//队列
//C++ 标准库中的基本用法
void test_queue()
{queue<int> myqueue;//1、push--在队尾将元素i入队列for (int i = 0; i < 10; ++i)myqueue.push(i);//2、size--返回队列元素的个数cout << myqueue.size() << endl;//3、emplace--在队列的末尾添加一个新元素,该元素在当前队列最后一个元素的后面myqueue.emplace(11);cout << myqueue.size() << endl;//4、empty()--判断队列是否为空//5、front()--返回队头元素的引用//6、back()--返回队尾元素的引用//6、pop()--将队头元素出队列while (!myqueue.empty()){//返回队头的数据cout << myqueue.front() << " ";myqueue.pop();}cout << endl;cout << myqueue.size() << endl;
}

2.4 工作原理

关于队列的理论基础,可以看文章
栈和队列的实现。

2.5 队列的模拟实现

本文中实现的MyQueue类是一个泛型队列,使用模板参数T来指定队列元素的类型,而模板参数Container来指定底层容器的类型,它默认为std::deque<T>,但也可以被替换为其他类型如std::list或std::vector。这种设计提供了灵活性,允许用户根据需要选择不同的底层容器。

2.5.1 构造函数

这里并未显示定义构造函数,所以MyQueue依赖于Container(默认为std::deque<T>)的默认构造函数来初始化_con成员。

2.5.2 push方法

目的:在队列的末尾添加一个元素。

参数:接受一个常量引用const T& value,代表要添加到队列中的元素。

实现:调用容器_con的push_back成员函数,将元素添加到容器的末尾。

代码如下:

//1、将元素添加队尾
void push(const T& val)
{_con.push_back(val);
}

2.5.3 pop方法

目的:移除队列开始的元素。

参数:无参数。

实现:首先检查队列是否为空,如果不为空,则调用容器_con的pop_front成员函数移除第一个元素。如果队列为空,抛出一个std::runtime_error异常。

//2、移除队头元素
void pop()
{if (!empty()){_con.pop_front();}else{throw std::runtime_error("Queue is empty.");}
}

2.5.4 front方法

目的:访问队列开始的元素

参数:无参数。

实现:如果队列不为空,返回容器_con的第一个元素的引用。如果队列为空,抛出一个std::runtime_error异常。

//3、访问队头元素的引用
T& front()
{if (!empty()){return _con.front();}else{throw std::runtime_error("Queue is empty.");}
}

​​​​​​​2.5.5 back方法

目的:访问队列末尾的元素。

参数:无参数。

实现:如果队列不为空,返回容器_con的最后一个元素的引用。如果队列为空,抛出一个std::runtime_error异常。

//4、访问队尾元素的引用
T& back()
{if (!empty()){return _con.back();}else{throw std::runtime_error("Queue is empty.");}
}

2.5.6 empty方法

目的:检查队列是否为空。

参数:无参数。

实现:返回一个布尔值,指示容器_con是否为空,这是通过调用_con的empty成员函数实现的。

//5、检查队列是否为空
bool empty()
{return _con.empty();
}

2.5.7 size方法

目的:返回队列中的元素数量。

参数:无参数。

实现:返回容器_con中元素的数量,这是通过调用_con的size成员函数实现的。

//6、返回队列的大小
size_t size()
{return _con.size();
}

栈和队列模拟实现的完整代码可参考:栈的模拟实现、队列的模拟实现。

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

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

相关文章

AI-Talk开发板之LED

一、说明 AI-Talk开发板上有一颗用户LED&#xff0c;连接在CH32 PA2管脚&#xff0c;低电平亮&#xff0c;高电平灭。 相关电路图如下&#xff1a; 需要提前给CH32V003烧录特定的固件才能将CH32作为CSK6011A的exmcu&#xff0c;参考AI-Talk开发板更新CH32固件。​​​​​​​…

如何查看Mac的处理器架构‌‌是ARM还是x86

‌通过命令行查看Mac的处理器架构‌‌ 打开终端&#xff08;Terminal&#xff09;。输入命令 uname -m 并回车。如果输出结果是 arm64&#xff0c;则表示你的Mac使用的是ARM架构&#xff1b;如果输出结果是 x86_64&#xff0c;则表示你的Mac使用的是x86架构。 如图&#xff1…

2024/9/4黑马头条跟学笔记(二)

app端文章列表 学习内容 需求分析 上方分类频道切换 布局&#xff0c;无图&#xff0c;单图&#xff0c;三张图 文章数据库表 导入文章数据库 结构分析 配置-文章 一对一&#xff0c;拆表&#xff0c;冷热数据分离满足范式 表的拆分-垂直分表 优势 查文章信息不会连带查…

Day10_0.1基础学习MATLAB学习小技巧总结(10)——程序流程控制

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 素材来源“数学建模清风” 特此说明&#xff1a;本博客的内容只在于总结在…

页面小组件-搜索栏(一)

样例展示 效果示例-折叠状态 效果示例-展开状态 代码示例 <custom-search-wrapper><!--showFoldBtn 需要展示折叠按钮时传值--><template slotleft><el-form:model"searchFormData"inlinesize"small"><el-form-item><e…

前端入门了解

1. 网页 1.1 网页概述 1.2 超文本标记语言 1.3 网页的形成 2. 浏览器了解 网页需要通过浏览器来展示&#xff0c;下面是关于浏览器的两点; 国际上通用的浏览器有如下六个&#xff08;百度&#xff0c;360&#xff0c;uc等是主要在国内使用&#xff09;&#xff0c; 3. We…

828华为云征文:华为云 Flexus X 实例性能测评——SuperBench 一键窥见性能

今天我拿到了华为云 Flexus X 实例&#xff0c;这款云服务是华为云推出的有一款明星产品&#xff0c;面向零售、金融、游戏等行业大多数通用工作负载场景。这次&#xff0c;我们就来测评一下它的性能到底怎么样&#xff01; Flexus 云服务 X 实例 在测评之前&#xff0c;我们…

使用 JAXB 将内嵌的JAVA对象转换为 xml文件

使用 JAXB 将内嵌的JAVA对象转换为 xml文件 1. 需求2. 实现&#xff08;1&#xff09;FileDesc类&#xff08;2&#xff09;MetaFileXml类&#xff08;3&#xff09;生成对应的xml文件 1. 需求 获取一个目录下所有文件的元数据信息&#xff08;文件名、大小、后缀等&#xff0…

Day14_0.1基础学习MATLAB学习小技巧总结(14)——字符串的比较、查找和替换

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 素材来源“数学建模清风” 特此说明&#xff1a;本博客的内容只在于总结在…

香港一带一路研究院国际事务研究中心副主任陈景才阐述香港在一带一路建设及区块链金融领域的关键作用

2024年8月28日&#xff0c;香港金管局举行Ensemble项目沙盒&#xff08;以下简称沙盒&#xff09;启动仪式&#xff0c;并宣布首阶段试验将涵盖四大代币化资产用例主题&#xff0c;标志着金融业在代币化技术的实际应用进程中迈出重要一步。香港一带一路研究院国际事务研究中心副…

Tomato靶场渗透测试

1.扫描靶机地址 可以使用nmap进行扫描 由于我这已经知道靶机地址 这里就不扫描了 2.打开网站 3.进行目录扫描 dirb http&#xff1a;//172.16.1.113 发现有一个antibot_image目录 4.访问这个目录 可以看到有一个info.php 5.查看页面源代码 可以发现可以进行get传参 6.…

苹果抽佣30%,国产手机抽佣50%,而且国产手机联合抽佣更霸道!

随着苹果抽佣30%被炒作&#xff0c;吐槽苹果的越来越多&#xff0c;然而国产手机抽佣50%&#xff0c;却没有人说话&#xff0c;甚至还有人为国产手机辩护&#xff0c;说什么可以自由选择&#xff0c;然而他们忘记了国产手机联合成立了硬核联盟共同抽佣50%&#xff0c;想逃&…

c++162 类的封装和访问

怎么样管理类管理对象 类如何定义对象 #include<iostream> using namespace std;//求圆的面积 class MyCirecle { public:double m_r;//属性 成员变量double m_s; public :double getR(){return m_r;}void setR(double r)//成员函数{m_r r;}double getS(){m_s 3.14…

国庆主题——html5+css+js国庆头像框生成

国庆主题——html5cssjs国庆头像框生成 一、前言二、功能展示四、其它五、源码下载 一、前言 国庆头像生成器这个工具可以让我们制作最近非常火爆的国庆主题头像&#xff0c;有多重不同的风格供我们选择&#xff0c;我们可以在这里在线制作头像。 二、功能展示 如下所示&…

基于SSM+MySQL的民宿推荐系统

系统背景 随着经济发展&#xff0c;各类电子产品普及千家万户。网民数量不断增加&#xff0c;网络显然已经成为了人际交流的重要形式。回顾近一个世纪的科技发展史&#xff0c;各类新的信息发布手段均随着时代洪流更新。旧时代是广播&#xff0c;报纸&#xff0c;电视&#xff…

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

昂科烧录器支持Fortior Tech峰岹科技的电机驱动专用芯片FU6812V

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Fortior Tech峰岹科技的高性能电机驱动专用芯片FU6812V已经被昂科的通用烧录平台AP8000所支持。 FU6812V是一款集成电机控制引擎(ME)和8051内核的高性能电机驱动专用芯片&…

Android Auto未来可能支持无线电广播

通过Android Auto&#xff0c;可以在车载收音机上使用 Google 地图、音乐、收听播客&#xff0c;还能获取天气等基本信息。最近&#xff0c;国外科技媒体9to5Google通过分析 Android Auto v12.3 和 v12.4的应用程序的代码发现了一些提示信息&#xff0c;特别提到了 AM、FM、HD …

信创实践(2):利用Leapp工具迁移CentOS至AnolisOS,实现系统升级与自主可控

1. 引言 为了满足用户在CentOS退出后对操作系统使用的诉求&#xff0c;OpenAnolis龙蜥社区正式发布了Anolis OS。越来越多的CentOS客户期望能够迁移到Anolis OS上来。操作系统迁移是一个复杂工程&#xff0c;手工迁移技术要求高&#xff0c;操作复杂度强&#xff0c;需要耗费大…

《‌黑神话:‌悟空》‌游戏攻略‌

时光荏苒&#xff0c;岁月如梭&#xff0c;不知不觉已经来到了2024年的9月份了。 ‌突然想写一篇关于《‌黑神话&#xff1a;‌悟空》‌的游戏攻略‌。 在《‌黑神话&#xff1a;‌悟空》‌这款以中国古代名著《‌西游记》‌为背景的动作角色扮演游戏中&#xff0c;‌玩家将扮…