stack模拟实现【C++】

news2024/9/19 6:37:01

文章目录

  • 全部的实现代码放在了文章末尾
  • 什么是适配器模式?
  • stack
    • 准备工作
      • 包含头文件
      • 定义命名空间
      • 类的成员变量
    • 默认成员函数
    • empty
    • size
    • top
    • push
    • pop
    • 全部代码

全部的实现代码放在了文章末尾

stack的模拟实现我采用了C++适配器模式

stack的适配器一般是deque,也可以是vector或者list
因为stack是有特殊限制的线性表【只能在栈顶插入删除】,所以只要是线性结构并且可以高效的实现头或者尾的插入和删除的线性表,就都可以作为stack的适配器


什么是适配器模式?

适配器模式是一种设计模式,它允许将不兼容接口的类一起工作

适配器模式通常用于以下情况:

  1. 希望使用一个类,但其接口与其他代码不兼容。
  2. 希望创建一个可重用的类,它能够将接口转换为其他接口。
  3. 希望使用第三方库或遗留代码,但其接口与其他代码不兼容。

适配器模式通常包括以下三个主要部分:

  1. 目标接口(Target):这是期望使用的接口,客户端代码只能与目标接口交互。
  2. 源接口(Adaptee):这是需要适配的类,其接口与目标接口不兼容。
  3. 适配器(Adapter):这是一个类,它实现了目标接口,并将调用转换为对源接口的调用。适配器将源接口的调用转换为目标接口的调用,使得客户端代码可以与目标接口交互。

可以类比我们生活中的家庭电源接口笔记本电脑充电口电源适配器,它们之间也是一种适配器关系

笔记本电脑充电口是上面提到的目标接口
家庭电源接口是上面提到的源接口
电源适配器是上面提到的适配器

笔记本电脑的充电口是不能和家庭电源接口直接连接进行充电的,因为笔记本电脑用的是直流电,而家庭电源输出的是交流电,所以要把交流电转换为直流电才能给笔记本电脑供电,而电源适配器就能做到这一点

对应了上面提到的适配器模式解决的问题:
可以将不兼容接口的类一起工作


stack

准备工作

创建两个文件,一个头文件mystack.hpp,一个源文件test.cpp

【因为模板的声明和定义不能分处于不同的文件中,所以把成员函数的声明和定义放在了同一个文件mystack.hpp中】

  1. mystack.hpp:存放包含的头文件,命名空间的定义,成员函数和命名空间中的函数的定义

  2. test.cpp:存放main函数,以及测试代码


包含头文件

  1. iostream:用于输入输出

  2. vector:提供vector类型的适配对象

  3. deque: 提供deque类型的适配对象


定义命名空间

在文件mystack.hpp中定义上一个命名空间mystack
把stack类和它的成员函数放进命名空间封装起来,防止与包含的头文件中的函数/变量重名的冲突问题


类的成员变量

只有一个,是适配器对象
在这里插入图片描述


默认成员函数

stack类的四大默认成员函数:构造函数,拷贝构造函数,析构函数,赋值运算符重载,都不需要手动写使用编译器提供的默认的即可

因为编译器给的默认的这四大成员函数,都有一个特性:
如果类的成员变量是其他类实例化的对象,调用本类的四大默认成员函数的时候,对其他类实例化的对象进行操作时就可以自动调用那个类自己的四大默认成员函数


empty

把stack的数据都存储在了适配器对象里面

所以判断适配器对象是否为空即可
bool empty()const
{
	return _obj.empty();
}

size

把stack的数据都存储在了 适配器对象里面

所以适配器对象的size就是stack的size
size_t size()const
{
	return _obj.size();
}

top

统一把线性表(适配器类)的尾作为  栈顶

因为vector的头插,头删效率低,为了照顾它就把尾作为栈顶

所以back就是栈顶的数据
T& top()
{
	return _obj.back();
}

const修饰的对象,只能调用const修饰的成员函数

const T& top() const
{
	return _obj.back();
}

push

统一把线性表(适配器类)的尾作为  栈顶

所以push,就是尾插
void push(const T& val)
{
	_obj.push_back(val);
}

pop

统一把线性表(适配器类)的尾作为  栈顶
所以pop,就是尾删
void pop()
{
	_obj.pop_back();
}

全部代码

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

namespace mystack
{
	//T是stack里面存储的数据的类型
	//con是适配器类的类型
	template<class T, class con = vector<T>>
	class stack
	{
	private:
		//使用适配器类类型创建  适配器对象
		con _obj;


	public:

		//把stack的数据都存储在了适配器对象里面
		//所以判断适配器对象是否为空即可
		bool empty()const
		{
			return _obj.empty();
		}

		//把stack的数据都存储在了适配器对象里面
		//所以适配器对象的size就是stack的size
		size_t size()const
		{
			return _obj.size();
		}

		//统一把线性表(适配器类)的尾作为  栈顶
		//所以back就是栈顶的数据
		T& top()
		{
			return _obj.back();
		}

		//const修饰的对象,只能调用const修饰的成员函数
		const T& top() const
		{
			return _obj.back();
		}

		//统一把线性表(适配器类)的尾作为  栈顶
		//所以push,就是尾插
		void push(const T& val)
		{
			_obj.push_back(val);
		}

		//统一把线性表(适配器类)的尾作为  栈顶
		//所以pop,就是尾删
		void pop()
		{
			_obj.pop_back();
		}
	};
}

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

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

相关文章

SpringBoot系列—2.SpringBoot拦截器篇

SpringBoot系列—1.IDEA搭建SpringBoot框架 SpringBoot系列—2.SpringBoot拦截器篇 SpringBoot系列—3.SpringBoot Redis篇 SpringBoot系列—4.SpringBoot 整合Mybatis、MP&#xff08;MyBatis-Plus&#xff09; SpringBoot系列—5.SpringBoot 整合Mybatis-Plus分页 1.新建拦截…

C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)

八种基本数据类型&#xff1a;byte、short、int、long、float、double、boolean、char byte 8位、有符号的以二进制补码表示的整数 min : -128&#xff08;-2^7&#xff09; max: 127(2^7-1) default: 0 对应包装类&#xff1a;Byte short 16位、有符号的以二进制补码表示…

将微信聊天记录导出成html等格式

通过github上的开源项目WechatMsg&#xff0c;可以将微信中的聊天记录&#xff08;包括文字、图片、语音、表情包甚至拍一拍&#xff09;导出&#xff0c;方便我们随时分享和查看&#xff0c;此外还有聊天记录分析等有趣的功能&#xff0c;感兴趣的小伙伴可以研究一下。我个人认…

静态网站怎么更新数据

今天看到个问题 我不是行业从业者&#xff0c;但目前遇到一个问题 我公司网站为纯静态&#xff0c;除了直接从html里修改文字外能不能这样 建立一个xml或者txt文档&#xff0c;其中有很多信息&#xff0c;例如网站名称&#xff0c;电话&#xff0c;备案号等&#xff0c;一行一行…

AI赋能项目集成:我的实战经验与洞见

背景 在传统的教学模式中&#xff0c;教师往往难以兼顾每位学生的个性化需求&#xff0c;学习信息的收集与分析也受限于时间和精力的限制&#xff0c;难以做到全面而深入。然而&#xff0c;每位学生都是独一无二的个体&#xff0c;他们拥有不同的学习风格、兴趣偏好以及理解能…

【IC前端虚拟项目】sanity_case的编写与通包测试

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 在花了大力气完成reference model之后,整个验证环境的搭建就完成了,再多看一下这个结构然后就可以进行sanity_case和通包测试: 关于sanity_case和通包测试我在很多篇文章中说过好多次了在这里就不赘述…

如何安装Visual Studio Code

Visual Studio Code&#xff08;简称 VS Code&#xff09; Visual Studio Code 是一款由微软开发的免费、开源的现代化轻量级代码编辑器。 主要特点包括&#xff1a; 跨平台&#xff1a;支持 Windows、Mac 和 Linux 等主流操作系统&#xff0c;方便开发者在不同平台上保持一…

ETL电商项目总结

ETL电商项目总结 ETL电商业务简介及各数据表关系 业务背景 ​ 本案例围绕某个互联网小型电商的订单业务来开发。某电商公司&#xff0c;每天都有一些的用户会在线上采购商品&#xff0c;该电商公司想通过数据分析&#xff0c;查看每一天的电商经营情况。例如&#xff1a;电商…

科普文:字节码class文件和字节码增强技术

1. 引言 1.1. 什么是字节码 Java字节码是指Java语言编译后生成的一种二进制文件格式&#xff0c;它包含了Java程序的所有信息&#xff0c;包括类信息、方法信息、变量信息等。字节码是Java程序执行的基础&#xff0c;它被用于实现Java虚拟机&#xff08;JVM&#xff09;的加载…

随手记:vsCode修改主题色为自定义颜色

因为工作需要长时间面对vscode&#xff0c;视力不好&#xff0c;想要把工具改成护眼色&#xff0c;于是就把vscode改成了自定义的护眼色 效果图&#xff1a; 操作步骤&#xff1a; 快捷键打开设置页面&#xff1a; 按住ctrlshiftp 选择Open setting 按回车键 打开setting页面编…

【STM32CubeMX】一 TIME定时器Mode and Configuration的详解

使用STM32CubeMX软件学习配置定时器&#xff0c;对Mode and Configuration进行分析各部分选项的功能。本次以TIM2为例进行分析。 一、 Slave Mode 可以配置的选项有&#xff1a; Disable External Clock Mode 1 外部时钟源模式1 Reset Mode 复位模式 Gated Mode 门控模式 Tri…

采用T网络反馈电路的运算放大器(运放)反相放大器

运算放大器(运放)反相放大器电路 设计目标 输入电压ViMin输入电压ViMax输出电压VoMin输出电压VoMaxBW fp电源电压Vcc电源电压Vee-2.5mV2.5mV–2.5V2.5V5kHz5V–5V 设计说明1 该设计将输入信号 Vin 反相并应用 1000V/V 或 60dB 的信号增益。具有 T 反馈网络的反相放大器可用…

scanf` 和 `printf` 通常比 `cin` 和 `cout` 在处理数据时的分析

#include<bits/stdc.h> using namespace std; int x[5000005],k; int main() {int n;scanf("%d%d",&n,&k);for(int i0;i<n;i)scanf("%d",&x[i]);sort(x,xn);//快排printf("%d",x[k]); }和#include<vector> #include&…

redis数据库(下)

集合键值对 集合的每一个元素也是字符串格式数据,是无序集合,并且元素不可重复(自动去重) 1.集合的创建和添加命令 sadd命令:无责创建有责添加 sadd 键名 元素1 元素2......... 注意:再次添加元素时,如果触发了集合的唯一性,那么命令执行结果就为0,表示执行失败…

JMeter使用小功能-(持续更新)

1、jmeter在同一个线程组内&#xff0c;uuid的复用 方式一&#xff1a; 方式二&#xff1a; 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…

折叠屏遇上Galaxy AI,三星新一代Galaxy Z系列开启移动终端新篇章

作者 | 曾响铃 文 | 响铃说 随着换机周期的普遍延长以及智能手机行业内竞争态势的日益激烈&#xff0c;传统的硬件升级与参数比拼已难以全面满足消费者日益多元化的需求。面对这一挑战&#xff0c;行业迫切需要探索新的增长路径与发展方向。 折叠屏技术的兴起&#xff0c;无…

护航信创落地!YashanDB与航天壹进制完成兼容性互认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与航天壹进制黑方容灾备份与恢复系统顺利完成兼容性互认证。测试结果表明&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;为用户提供全方位、安全可靠的数据安全保护方案&#xff0c;护航央国企、金融…

【AMD/Xilinx】FPGA远程烧录调试工具安装及使用

问题描述 在学习工作中&#xff0c;本人遇到了连接FPGA的服务器电脑没有Vivado或Vivado版本较低&#xff0c;导致没办法查看ila的情况。在这种情况下一方面重新安装Vivado需要占用大量存储空间&#xff0c;另一方面使用远程桌面软件连接服务器电脑的画质较为模糊&#xff0c;影…

自学第十九天----深入探究数组下

3. 数组越界 数组的下标是有范围限制的。 数组的下规定是从0开始的&#xff0c;如果数组有n个元素&#xff0c;最后一个元素的下标就是n-1。 所以数组的下标如果小于0&#xff0c;或者大于n-1&#xff0c;就是数组越界访问了&#xff0c;超出了数组合法空间的访问。 C语言本身…

即将被淘汰 这几门编程语言!

又到了周五了&#xff0c;忙碌了一周&#xff0c;可以放松放松一下了&#xff01; 在科技迅速发展的今天&#xff0c;编程语言的更新迭代速度令人惊叹。从经典的C语言到现代的Python&#xff0c;编程语言不断进化&#xff0c;满足着不同领域的需求。然而&#xff0c;有些编程语…