嵌套和递归使用模板类

2023-11-04

模板栈

#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;
	}

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套和递归使用模板类 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • Chisel实验笔记(二)

    在上一篇 Chisel实验笔记 一 中 我们的到了对应的verilog文件 本文将采用Icarus Verilog GtkWave进行仿真验证 实验平台还是Ubuntu14 04 64位 1 安装Icarus Verilog 0 9 7 首
  • python入门基础代码初学

    python入门基础代码初学 一 检查python安装 二 print使用 二 使用python运算 三 enumerate 函数 一 检查python安装 PS C Users admin gt python Python 3 8 8 t
  • 在vue中使用element-ui 里面的按钮点击后显示加载中,防止重复提交

    点击前 点击后
  • .net3.5安装问题

    net3 5安装问题 对于部分软件 需安装 net3 5才能正常运行 微软默认Windows10版本未安装 net3 5 在线安装比较麻烦 可能遇到各种问题 现推荐离线安装方式 1 下载相关文件 从衔接下载文件解压到C盘 如图1 1所示 2
  • python中3∧2_python 中根据python版本(2或3)定义函数

    示意代码如下 coding UTF 8 import time import socket import os import sys if sys version info major 2 reload sys sys setdefault
  • 怎么修改地磅服务器的修改记录,如何手动查看和修改电子地磅数字传感器通讯地址...

    如何手动查看和修改电子地磅数字传感器通讯地址 以地磅数字仪表XK3190 DS10为例 为大家来做介绍 1 电子地磅传感器通讯地址是地磅仪表识别数字传感器的标志 数字传感器的通讯地址就是大家通常所说的 传感器编号 XK3190 DS10 通
  • 华为上机试题8(查找最大递减数)

    题目 给出一个非负整数 找到这个非负整数中包含的最大递减数 一个数字的递减数是指相邻的数位从大到小排列的数字 如 95345323 递减数有 953 95 53 53 532 32 那么最大的递减数为953 如果输入的数字为负数 返回 1
  • Webpack中Loader与Plugin

    前言 Webpack的核心功能是通过抽离出很多插件来实现的 因此系统内功能的划分粒度很细 这样做到了完美解偶同时又分工明确 代码容易维护 所以说插件机制是也是Webpack的核心知识 那么下面我们就来写介绍一下Loader与Plugin 并
  • DVWA-CSRF跨站请求伪造 Medium和Low级别

    1代码分析 过滤条件 if stripos SERVER HTTP REFERER SERVER SERVER NAME false 判断 SERVER SERVER NAME 在 SERVER HTTP REFERER 中是否存在 寻找第
  • 滴滴Chameleon 原生跳转vue界面 

    滴滴Chameleon 原生跳转vue界面 CmlWeexInstance reload url CmlWeexView getInstance reload url
  • 解决win10下localhost打不开的问题

    转自 https blog csdn net wk6333 article details 50678420 打开控制面板 添加或删除程序 然后但左侧栏的 启用或关闭Windows功能 把 Internet Information Serv
  • vue文件下载

    1 创建下载按钮
  • pidstat命令详解

    一 命令介绍 pidstat是sysstat工具中的一个命令 用于监控进程的cpu 内存 线程 IO及上下文切换等系统资源的占用情况 格式 pidstat options
  • SpringCloud-注册中心简单了解与使用

    前言 什么是SpringCloud 什么是微服务 能干什么 为什么要用SpringCloud 注册中心 什么是SpringCloud 大家都知道SpringCloud是一种微服务架构 模式 SpringCloud简单来说就是微服务架构技术落
  • ArrayList非线程安全记录

    一 问题描述 线上一个查询服务 偶尔会报一次查询出来的结果集合包含null 二 问题排查 在多线程查询过程中 使用了ArrayList 多线程查询出来后执行ArrayList add 然而ArrayList并不是线程安全的集合 会导致nul
  • linux红帽8怎么安yum,RedHat Linux 8本地Yum源配置方法

    1 挂载系统光盘到 mnt cdrom目录 mkdir p mnt cdrom mount dev sr0 mnt cdrom 2 设置系统启动后将光盘自动挂载到 mnt cdrom echo dev sr0 mnt cdrom iso96
  • 电商数据分析实战第一篇——客户消费行为分析

    一 分析背景 为了提高店铺的收益 进行准确的客户运营策略 使用店铺201910至202002的销售数据进行分析 根据客户的消费趋势 消费习惯把握客户的消费现状和心理 挖掘出高价值用户群体 完善销售运营策略 简单说明一下 客户分析包括基本属性
  • Upload LABS Pass-8

    第八关在后端使用了黑名单 并过滤了大小写 点以及空格 但并未过滤数据流 我们使用代理拦截请求 在文件后缀名中添加数据流 绕过黑名单 准备一个 8 php 文件 内容为一句话木马 上传 8 php 文件 并使用代理 此处使用 Burp Sui
  • JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中 使用到JSON进行数据的传递 特别是从前端传递到后台 前台可以直接采用ajax的data函数 按json格式传递 后台Request即可 但有的时候 需要传递多个参数 后台使用request进行接收 有时传递了几个数值 还好
  • 嵌套和递归使用模板类

    嵌套和递归使用模板类 模板栈 模板数组 栈中嵌套数组 数组中嵌套栈 数组中嵌套数组 模板栈 pragma once include