stack和queue(2): 模拟实现

一、stack的模拟实现

stack是一个容器适配器,它的底层是通过对某种容器类进行封装来实现,标准容器list和vector,deque都符合这些需求,默认情况下,如果没有为stack指定底层容器就默认是使用deque实现。

我们在模拟实现的时候也通过借助容器的方式来实现。

1.1 stack构造以及容量

1.1.1 stack构造

//栈的构造
stack() {}

对于构造函数直接采用默认的无参构造就行。

1.1.2 stack的容量

//返回栈内的元素个数,直接返回容器的size即可
size_t size()const
{return c.size();
}
//判断栈是否为空,直接判断容器是否为空即可
bool empty()const
{return c.empty();
}

size接口函数直接返回底层容器的size函数的返回值即可,empty判空函数也直接返回底层容器的判空接口即可。

1.2 stack的访问和修改操作

//push直接借助传入容器的push即可
void push(const T& x)
{c.push_back(x);
}
//pop借助容器的pop将栈顶元素即数组中的最后一个元素pop掉
void pop()
{c.pop_back();
}
//返回栈顶元素即数组的最后一个元素
T& top()
{return c.back();
}const T& top()const
{return c.back();
}

push接口我们直接调用容器的push_back接口将x尾插到容器里面即可,对于pop接口,由于stack是服从先进后出的原则的,因此调用底层容器的尾删函数即可。对于top接口直接返回容器尾部的元素即可。

1.3 stack模拟实现的完整代码

template<class T, class Con = deque<T>>
//栈
class stack
{public://栈的构造stack() {}//push直接借助传入容器的push即可void push(const T& x){c.push_back(x);}//pop借助容器的pop将栈顶元素即数组中的最后一个元素pop掉void pop(){c.pop_back();}//返回栈顶元素即数组的最后一个元素T& top(){return c.back();}const T& top()const{return c.back();}//返回栈内的元素个数,直接返回容器的size即可size_t size()const{return c.size();}//判断栈是否为空,直接判断容器是否为空即可bool empty()const{return c.empty();}private:Con c;};

以上是我们模拟实现的stack的完整代码。

二、queue的模拟实现

2.1 queue的构造以及容量

2.1.1 queue的构造

//队列的构造
queue() {}

与stack的构造的实现相同,直接使用默认的无参构造即可。

2.1.2 queue的容量

//返回队列中的有效数据,即返回容器的size
size_t size()const
{return c.size();
}
//判断队列是否为空,即判断容器是否为空即可
bool empty()const
{return c.empty();
}

这里的实现也与stack那边的实现基本相同,对于size直接返回底层容器的size接口即可,对于empty判空操作也是直接返回底层容器的判空接口即可。

2.2 queue的访问和修改操作

//进队列,先进先出,队尾进队头出,选择头插
void push(const T& x)
{c.insert(c.begin(), x);
}
//出队列尾删即可
void pop()
{c.pop_back();
}
//返回队尾元素,即返回容器的头
T& back()
{return c.front();
}const T& back()const
{return c.front();
}
//返回队头元素,即返回容器的尾
T& front()
{return c.back();
}const T& front()const
{return c.back();
}

对于queue的push由于queue是服从先进先出的原则的,因此我们选择通过头插来实现它的push接口,pop接口就直接调用底层容器的pop_back即可,back接口是用来返回队尾元素的,我们直接返回底层容器的front即可,因为底层容器的实现中是将头作为队列尾的,对于front接口就是与back接口相反了的,直接返回底层容器的back即可。

2.3 queue模拟实现的完整代码

template<class T, class Con = deque<T>>
//队列
class queue
{
public://队列的构造queue() {}//进队列,先进先出,队尾进队头出,选择头插void push(const T& x){c.insert(c.begin(), x);}//出队列尾删即可void pop(){c.pop_back();}//返回队尾元素,即返回容器的头T& back(){return c.front();}const T& back()const{return c.front();}//返回队头元素,即返回容器的尾T& front(){return c.back();}const T& front()const{return c.back();}//返回队列中的有效数据,即返回容器的sizesize_t size()const{return c.size();}//判断队列是否为空,即判断容器是否为空即可bool empty()const{return c.empty();}private:Con c;};

以上就是我们进行模拟实现的queue类的完整代码了。


对于stack和queue的模拟实现到这里就结束了,对于它们的模拟实现我们是通过对其他容器进行封装作为它的底层容器的方式实现的,对于传统的模拟实现也是简单了很多,如果需要博客中的代码请点击下面仓库链接获取:

stack和queue的模拟实现的完整代码

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

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

相关文章

Vuex 是什么?VueX简介

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介Vuex 是什么核心概念1.State&#xff08;状态&#xff09;2. Getter&#xff08;获取器&#xff09;3. Mutation&#xff08;突变&#xff09;4. Action&#xff08;动作&#xff09;5. Module&#xff08;模块&#xff09; 原理解…

使用STS临时访问凭证通过客户端直连OSS对象存储服务器

目录 1、导论 2、客户端直传 3、创建RAM用户以及RAM角色 4、如何实现客户端直传 4.1、跨域访问 4.2、安全授权 5、代码示例 5.1、后端代码实例 5.2、客户端代码实例 1、导论 最近在做项目的过程中使用到了阿里云OSS来存储客户端上传的文件&#xff0c;方法是直接将客…

Keras深度学习框架实战(3):EfficientNet实现stanford dog分类

1、通过EfficientNet进行微调以实现图像分类概述 通过EfficientNet进行微调以实现图像分类&#xff0c;是一个使用EfficientNet作为预训练模型&#xff0c;并通过微调&#xff08;fine-tuning&#xff09;来适应特定图像分类任务的过程。一下是对相关重要术语的解释。 Effici…

Flutter-自定义可展开文本控件

Flutter 在移动开发中&#xff0c;常常需要处理一些长文本显示的场景&#xff0c;如何优雅地展示这些文本并允许用户展开和收起是一个常见的需求。在本文中&#xff0c;我将分享如何使用Flutter实现一个可展开和收起的文本控件。 效果 我们将实现一个可展开和收起的文本控件…

SpringEvent事件发布订阅Demo

文章目录 实现事件定义事件监听器方式一方式二 定义事件发布者方式一方式二 项目测试原理 本文参考&#xff1a; 基础用法&#xff1a;Spring Event事件发布&消费Demo - HumorChen99 - 博客园 (cnblogs.com) 比较全面的用法&#xff1a;Spring Event 事件发布/监听机制 详…

yolov10模块

yolov10模块 1 C2f2 C2fCIB2.1 CIB2.2 RepVGGDW 3 PSA4 SCDown5 v10Detect 论文代码&#xff1a;https://github.com/THU-MIG/yolov10 论文链接&#xff1a;https://arxiv.org/abs/2405.14458 Conv是Conv2dBNSiLU PW是Pointwise Convolution(逐点卷积) DW是Depthwise Convolut…

SpringMvc的工作流程是怎样的

Spring MVC 的工作流程涉及多个组件&#xff0c;它们协同工作来处理HTTP请求并生成响应。下面是一步步说明 Spring MVC 如何处理一个 HTTP 请求&#xff1a; DispatcherServlet 接收请求&#xff1a; 用户发送 HTTP 请求到服务器&#xff0c;请求被前端控制器 DispatcherServle…

python API自动化(Requests库应用)

1.接口自动化的逻辑 接口测试自动化&#xff0c;简单来讲就是功能测试用例脚本化然后执行脚本&#xff0c;产生一份可视化测试报告。不管什么样的测试方式&#xff0c;都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢&#xff1f;一句话概括就是为了节省人力成本 …

【SQL学习进阶】从入门到高级应用【企业真题】

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题MySQL行转列使用case whengroup by完成 第十题 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f495;希望您在这…

疫情物资捐赠和分配系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;机构管理&#xff0c;用户管理&#xff0c;发放管理&#xff0c;物资管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;物资论坛&#xff0c;公告信息…

STM32作业设计

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

彻底卸载Windows Defender

概述 卸载Windows Defender的方法有很多&#xff0c;如修改注册表、组策略&#xff0c;执行脚本等等&#xff0c;这些方法操作过于繁琐和复杂&#xff0c;不适合小白&#xff0c;今天带来一款强大的卸载工具&#xff0c;只需要以管理员身份运行该软件即可&#xff0c;不用其他操…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 6插图

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 Chapter 6插图

Stable Diffusion详细教程

目录 &#x1f40b;引言 &#x1f40b;Stable Diffusion基本概念 &#x1f988;潜在扩散模型 &#x1f988;图像生成原理 &#x1f40b;Stable Diffusion安装部署 &#x1f988;环境要求 &#x1f988;安装步骤 &#x1f40b;Stable Diffusion阶段 &#x1f988;准备阶…

git 下载失败

-- 错误0 加 sudo -- 错误 $ git clone https://github.com/espressif/arduino-esp32.git -b release/v2.x arduino Cloning into arduino... remote: Enumerating objects: 53886, done. remote: Counting objects: 100% (1194/1194), done. remote: Compressing objects: 1…

PHP 页面报错Warning</b>: Cannot modify header information - headers already sent by

先给出解决方案再解释&#xff0c;如果急着用就不用看解释了。 解决方案一&#xff1a;保存php文件编码为utf-8无BOM码&#xff0c;具体操作可以用notepad等编辑器完成&#xff0c;把 sesstion_start() 放在文档所有输出&#xff08;包括html标签和php的输出语句&#xff0c;具…

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…

Java筑基-集合[Set、Map、List、Stack、Queue]

这里写目录标题 一、Collection接口结构图二、Set集合1、常用方法 三、List集合1、List集合常用方法2、代码案例 四、Stack集合1、方法2、代码展示 五、Queue集合1、常用的方法2、代码展示 六、Map集合1、基本概念2、常用方法3、代码展示 一、Collection接口结构图 二、Set集合…

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)

客户管理模块 0.用户定位功能0.1 需求0.2 接口分析0.3 接口开发Controller层开发Service层开发 1.我的地址簿功能1.1 需求1.2 数据库设计1.3 新增地址簿1.3.1 接口设计1.3.2 接口开发Controller层开发Service层开发测试功能 1.4 地址簿查询1.4.1 接口设计1.4.2 接口开发Control…

Caliburn.Micro框架学习笔记——多页面处理案例

在聊这个之前&#xff0c;我们先来看一个静态类 在 Caliburn.Micro 中&#xff0c;ViewLocator 是一个用于查找和关联视图与视图模型的静态类。默认情况下&#xff0c;它根据约定&#xff08;命名约定或其他规则&#xff09;自动找到与视图模型相对应的视图。然而&#xff0c;…