嵌套和递归使用模板类

news2024/11/26 6:03:18

嵌套和递归使用模板类

  • 模板栈
  • 模板数组
  • 栈中嵌套数组
  • 数组中嵌套栈
  • 数组中嵌套数组

模板栈

#pragma once
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

template<class DataType>
class mystack2
{
private:
	DataType* items;  //栈数组
	int stacksize;   //栈实际大小
	int top;         //栈顶指针
public:
	// 构造函数:1)分配栈数组内存;2)把栈顶指针初始化为0。
	mystack2(int size = 3) ;
	//析构函数
	~mystack2();
	mystack2& operator=(const mystack2& v);  //重载赋值运算符
	bool isempty()const;
	bool isfull()const;
	bool push(const DataType& item);
	bool pop(DataType& item);
	void show();
};

template<class DataType>
inline mystack2<DataType>::mystack2(int size) :stacksize(size), top(0)
{
	items = new DataType[stacksize];
}

template<class DataType>
inline mystack2<DataType>::~mystack2()
{
	delete[]items;
	items = nullptr;
}

template<class DataType>
inline mystack2<DataType>& mystack2<DataType>::operator=(const mystack2& v)
{
	delete[] items;         // 释放原内存。
	stacksize = v.stacksize;     // 栈实际的大小。
	items = new DataType[stacksize];   // 重新分配数组。
	for (int ii = 0; ii < stacksize; ii++) items[ii] = v.items[ii];    // 复制数组中的元素。
	top = v.top;     // 栈顶指针。
	return *this;
	// TODO: 在此处插入 return 语句
}

template<class DataType>
inline bool mystack2<DataType>::isempty() const
{

	return top==0;
}

template<class DataType>
inline bool mystack2<DataType>::isfull() const
{

	return top==stacksize;
}

template<class DataType>
inline bool mystack2<DataType>::push(const DataType& item)
{
	if (top < stacksize) { items[top++] = item; return true; }
	return false;
}

template<class DataType>
inline bool mystack2<DataType>::pop(DataType& item)
{
	if (top > 0) { item = items[--top]; return true; }
	return false;
}

template<class DataType>
inline void mystack2<DataType>::show()
{
	DataType item;
	cout << "栈元素为" << endl;
	while(isempty() == false) {
		
		pop(item);
		cout << item <<"  ";
	}
	cout << endl;
}

void testMystack();

在这里插入图片描述
在这里插入图片描述

模板数组

动态增长的数组

#pragma once
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

template<class T>
class myarr2
{
private:
	int len;
	T* items;
public:
	// 默认构造函数,分配内存。
	myarr2(int size=2);
	~myarr2();
	//重载赋值运算符,实现深拷贝
	myarr2& operator=(const myarr2& v);
	void show();
	int size()const;
	//扩展数组
	void resize(int size);
	// 重载操作符[],可以修改数组中的元素
	T& operator[](int i);
	// 重载操作符[],不修改数组中的元素
	const T& operator[](int ii) const;
	//插如元素
	bool push(const T& item,int position);
};

template<class T>
inline myarr2<T>::myarr2(int size) :len(size)
{
	cout << "调用构造函数为数组长度赋值" << endl;
	items = new T[len];
}

template<class T>
inline myarr2<T>::~myarr2()
{
	delete [] items;
	items = nullptr;
}

template<class T>
inline myarr2<T>& myarr2<T>::operator=(const myarr2& v)
{
	delete [] items;
	len = v.len;
	items = new T[len]; //重新创建数组
	for (int i = 0; i < len; i++) {
		items[i] = v.items[i];
	}
	return *this;
	// TODO: 在此处插入 return 语句
}

template<class T>
inline void myarr2<T>::show()
{
	for (int i = 0; i < len; i++) {
		cout << i << " 位置的值为" << items[i] << " " << endl;
	}
	cout << endl;
}

template<class T>
inline int myarr2<T>::size() const
{
	return len;
}

template<class T>
inline void myarr2<T>::resize(int size)
{
	        // 护展数组的内存空间。        深拷贝来扩展空间
	if (size <= len) return;   // 只能往更大扩展。
	T* tmp = new T[size];   // 分配更大的内存空间。
	for (int ii = 0; ii < len; ii++) tmp[ii] = items[ii];     // 把原来数组中的元素复制到新数组。
	delete[] items;    // 释放原来的数组。
	items = tmp;      // 让数组指针指向新数组。
	len = size;           // 扩展后的数组长度。
}

template<class T>
inline T& myarr2<T>::operator[](int i)
{
	if (i >= len) resize(i + 1);    // 扩展数组。 一次扩展一个单位长度
	return items[i];
	// TODO: 在此处插入 return 语句
}

template<class T>
inline const T& myarr2<T>::operator[](int ii) const
{
	return items[ii]; 
	// TODO: 在此处插入 return 语句
}

template<class T>
inline bool myarr2<T>::push(const T& item, int position)
{
	if (position <= len) { items[position -1] = item; return true; }
	return false;
}


void showmyarr2();

在这里插入图片描述
在这里插入图片描述

栈中嵌套数组

	cout << endl;
	cout << "栈中嵌套数组" << endl;
	mystack2<myarr2<string>> sv;
	myarr2<string> tmp;
	tmp[0] = "长沙0"; tmp[1] = "珠海0"; sv.push(tmp);   //第一次入栈
	tmp[0] = "长沙1"; tmp[1] = "珠海1"; sv.push(tmp);   //第二次入栈
	tmp[0] = "长沙2"; tmp[1] = "珠海2"; sv.push(tmp);   //第三次入栈
	// 用嵌套的循环,把sv容器中的数据显示出来。
	while (sv.isempty() == false)
	{
		sv.pop(tmp);   // 出栈一个元素,放在临时容器中。
		for (int ii = 0; ii < tmp.size(); ii++)   // 遍历临时Vector<string>容器,显示容器中每个元素的值。
			cout << " vs[" << ii << "] = " << tmp[ii] << endl;
	}

在这里插入图片描述

数组中嵌套栈

	cout << "数组中嵌套栈" << endl;
	myarr2<mystack2<string>> vs;
	vs[0].push("小明0"); vs[0].push("小红0"); vs[0].push("小军0");
	vs[1].push("小明1"); vs[1].push("小红1"); vs[1].push("小军1");
	vs[2].push("小明2"); vs[2].push("小红2"); vs[2].push("小军2");
	// 用嵌套的循环,把vs容器中的数据显示出来。
	for (int ii = 0; ii < vs.size(); ii++)         // 遍历Vector容器。
	{
		while (vs[ii].isempty() == false)      // 遍历Stack容器。
		{
			string item; vs[ii].pop(item); cout << "item = " << item << endl;
		}
	}

在这里插入图片描述

数组中嵌套数组

cout << endl;
	cout << " 数组中嵌套数组" << endl;
	cout << "和二维数组的区别为:二维数组中,不同列的长度固定,这里嵌套数组,长度由自己确定" << endl;
	myarr2<myarr2<string>> vv;
	vv[0][0] = "西施1"; vv[0][1] = "西施2";  vv[0][2] = "西施3";
	vv[1][0] = "西瓜1"; vv[1][1] = "西瓜2";
	vv[2][0] = "冰冰1"; vv[2][1] = "冰冰2";   vv[2][2] = "冰冰3";  vv[2][3] = "冰冰4";

	// 用嵌套的循环,把vv容器中的数据显示出来。
	for (int ii = 0; ii < vv.size(); ii++)
	{
		for (int jj = 0; jj < vv[ii].size(); jj++)
			// cout << " vv[" << ii << "][" << jj << "] = " << vv[ii][jj] << endl;
			cout << vv[ii][jj] << " ";
		cout << endl;
	}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Java面向对象程序开发——文件与流

文章目录 前言File类IO字符流与字节流字符流字节流打印流缓冲流 前言 File类 是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 方法有三类&#xff1a;1获取、2判断、3创建或删除 public String getAbsolutePath() &#xff1a;返回…

ELK部署安装

目录 一、环境准备 1.准备三台服务器&#xff08;带图形化的linuxCentOS7&#xff0c;最小化缺少很多环境&#xff09; 2.修改主机名 3.关闭防火墙 4.elk-node1、elk-node2 用系统自带的java 5.上传软件包到node1和node2 二、部署elasticsearch 1、node1、node2操作 2.no…

《华尔街幽灵》的三大交易规则

规则1&#xff1a;只持有正确的仓位 如果你下单后经过一段时间&#xff0c;市场没有证明你的交易是正确的&#xff0c;那么应该立即平仓。交易者在每次建仓后&#xff0c;首先应关注保护本金&#xff0c;及早平掉不正确的仓位&#xff0c;而不是过多考虑盈利金额。 如何判断交…

生命在于学习——风险评估

风险评估的目录 一、网络安全风险评估概述1、概念2、意义3、步骤4、基本原则5、评估要素6、网络安全风险评估方法 二、网络安全风险评估方法三、网络安全风险评估方案1、确定评估范围和目标2、收集信息3、评估威胁和漏洞4、评估安全控制5、评估风险和制定建议6、报告和沟通 四、…

匿名苏丹的网络攻击仍在继续: 继微软之后拳头游戏成为最新目标

黑客组织 "匿名苏丹 "声称&#xff0c;它对美国视频游戏开发商和出版商Riot Games发起了分布式拒绝服务&#xff08;DDoS&#xff09;攻击。 据称匿名苏丹的目标是Riot Games的登录门户&#xff0c;该组织在Telegram帖子中宣布&#xff0c;这次攻击持续了30分钟至1小…

《随便测测》做UI测试

目录 前排提示 使用playwright录制ui操作 创建UI模板 运行用例 查看报告 再次编辑代码 再次查看报告 selenoid服务搭建 配置selenoid服务地址 总结 前排提示 1.使用playwright[selenoid]&#xff0c;可选的远程浏览器执行用例 2.没有采用 PageObjectModule&#xff0…

展示与处理复杂JSON数据——gradio库的JSON模块详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

从小白到大神之路之学习运维第54天--------ELK技术堆栈---

第三阶段基础 时 间&#xff1a;2023年7月6日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; ELK技术堆栈 目录 服务器设置&#xff1a; 部署elasticsearch集群&#xff1a; 配置elasticsearch集群&#xff…

Vue2中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…

【数据分析 - 基础入门之NumPy②】Jupyter Notebook安装及使用

知识目录 前言一、Jupyter Notebook安装使用1.1 Jupyter Notebook的三种打开方式1、点击Anaconda Prompt打开2、点击Jupyter Notebook打开3、使用Powershell打开 1.2 Jupyter Notebook的两种键盘输入模式1、编辑模式2、命令模式 二、Jupyter Notebook魔法命令2.1 查看帮助文档2…

2023-07-06:RabbitMQ中的AMQP是什么?

2023-07-06&#xff1a;RabbitMQ中的AMQP是什么&#xff1f; 答案2023-07-06&#xff1a; AMQP AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;是一个应用层协议的开放标准&#xff0c;旨在设计面向消息的中间件。基于AMQP协议的客户端和消息中间件可以自由…

Mysql中IP地址如何在数据库中存储

用无符号的32位整数存储&#xff0c;不要用字符串存储ip 为什么呢&#xff1f; 在Mysql中&#xff0c;当存储ipv4地址的时候&#xff0c;应该使用32位的无符号&#xff08;int unsigned&#xff09;来存储ip地址&#xff0c;而不是使用字符串&#xff0c;用int unsigned类型存…

4-Spring cloud之搭建Ribbon负载均衡——服务器上实操(下)

4-Spring cloud之搭建Ribbon负载均衡——服务器上实操&#xff08;下&#xff09; 1. 前言1.1 Ribbon负载均衡架构图 2. Ribbon自带的负载均衡2.1 Ribbon自带的负载均衡算法2.2 自带负载均衡之间的切换 3. Ribbon自定义负载均衡3.1 自定义Ribbon负载均衡&#xff08;简单试用&a…

【IMX6ULL - LOGO替换】根文件系统主机名logo替换教程

1、修改linux主机的配置文件/etc/hostname里的主机名 2、重启 reboot

2023电商购物网站有哪些知名和靠谱的?

最近几年&#xff0c;人们的消费方式发生了极大的改变&#xff0c;在这种趋势之下&#xff0c;很多企业都开始着手搭建自己的网购平台&#xff0c;下面是小编盘点的国内市场上较为出名的网购平台&#xff0c;大家可以借鉴其运营模式! 1、淘宝网 在中国&#xff0c;淘宝网可以说…

推荐这10款好用的产品设计软件,轻松提效

在现代技术飞速发展的时代&#xff0c;产品设计是创新和成功的关键。本文将向您推荐10款顶级产品设计软件&#xff0c;为您的设计过程增添灵感和效率。 1、即时设计 即时设计是一个基于云的产品设计协作一体化工具&#xff0c;具有很强的功能和灵活性&#xff0c;它提供了全面…

详细解读Sui Gas运作机制和其他你不知道的细节

Sui的Gas费模型使链上交互费用变得可预测而且更低廉&#xff0c;这两个关键特征对面向全球范围内的娱乐和实用apps的基础设施十分关键。区块链的Gas费是指处理事务需要支付的价格&#xff0c;用于补偿和奖励支持网络运行的服务商。 通常&#xff0c;用户支付Gas费来执行网络上…

Webpack打包ts文件

安装依赖包&#xff1a; npm i -D webpack webpack-cli typescript ts-loader 配置webpack配置文件&#xff08;webpack.config.js&#xff09;&#xff1a; //webpack中所有的配置文件信息都得写在module.exports中 module.exports{//指定入口文件entry:./src/index.ts//指定…

terminal 终端Ctrl+Shfit+E键与搜狗输入法冲突Linux

下载完搜狗输入法后&#xff0c;发现CtrlShfitE不能在终端分屏了&#xff0c;原因是和搜狗的快捷键冲突了&#xff0c;把搜狗的禁用了或者换成其它快捷键即可 界面右上角打开搜狗拼音&#xff0c;点击属性设置 把勾去掉或者换其它快捷键

eladmin环境搭建

1、参考这里的简介、快速了解、快速开始 简介 | ELADMIN 在线文档 2、后台我用的是Idea&#xff0c;要记得安装jdk、下载maven&#xff0c;Idea中要记得核对Settings、Project Structure的jdk、maven相关配置。同时也要核对数据库配置是否是好的&#xff0c;数据库是否能连接…