C++ 嵌套和递归使用模板类

发布于:2024-07-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

在C++11之前,嵌套使用模板类的时候,> >之间要加空格。


#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
                   
template <class DataType>
class Stack       // 栈类
{
private:
	DataType* items;               // 栈数组。
	int   stacksize;         // 栈实际的大小。
	int   top;                  // 栈顶指针。
public:
	// 构造函数:1)分配栈数组内存;2)把栈顶指针初始化为0。
	Stack(int size = 3) :stacksize(size), top(0) {
		items = new DataType[stacksize];
	}
	~Stack() {
		delete[] items; items = nullptr;
	}
	Stack& operator=(const Stack& 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;
	}
	bool isempty() const {            // 判断栈是否为空。
		return top == 0;
	}
	bool isfull() const {                 // 判断栈是否已满。
		return top == stacksize;
	}
	bool push(const DataType& item) {   // 元素入栈。
		if (top < stacksize) { items[top++] = item; return true; }
		return false;
	}
	bool pop(DataType& item) {               // 元素出栈。
		if (top > 0) { item = items[--top]; return true; }
		return false;
	}
};
                
template <class T>
class Vector           // 动态数组。
{
private:
	int len;               // 数组元素的个数。
	T* items;           // 数组元素。
public:
	// 默认构造函数,分配内存。
	Vector(int size = 2) :len(size) {
		items = new T[len];
	}
	~Vector() {         // 析构函数
		delete[] items; items = nullptr;
	}
	Vector& operator=(const Vector& v)   // 重载赋值运算符函数,实现深拷贝。
	{
		delete[] items;           // 释放原内存。
		len = v.len;                // 数组实际的大小。
		items = new T[len];  // 重新分配数组。
		for (int ii = 0; ii < len; ii++) items[ii] = v.items[ii];    // 复制数组中的元素。
		return *this;
	}
	void 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;           // 扩展后的数组长度。
	}
	int size() const { return len; }     // 获取数组长度。
	T& operator[](int ii) {   // 重载操作符[],可以修改数组中的元素。
		if (ii >= len) resize(ii + 1);    // 扩展数组。
		return items[ii];
	}
	const T& operator[](int ii) const { return items[ii]; }  // 重载操作符[],不能修改数组中的元素。
};
                   
int main()
{
	// Vector容器的大小缺省值是2,Stack容器的大小缺省值是3。
	// 创建Vector容器,容器中的元素用Stack<string>。
	Vector<Stack<string>> vs;         // C++11之前,>>之间要加空格。
               
	// 手工的往容器中插入数据。
	vs[0].push("西施1"); vs[0].push("西施2"); vs[0].push("西施3");        // vs容器中的第0个栈。
	vs[1].push("西瓜1"); vs[1].push("西瓜2"); vs[1].push("西瓜3");        // vs容器中的第1个栈。
	vs[2].push("冰冰");   vs[2].push("幂幂");                                            // vs容器中的第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;
		}
	}
             
	// 创建Stack容器,容器中的元素用Vector<string>。
	Stack<Vector<string>> sv;
              
	Vector<string> tmp;       // 栈的元素,临时Vector<string>容器。
	// 第一个入栈的元素。
	tmp[0] = "西施1"; tmp[1] = "西施2";  sv.push(tmp);
	// 第二个入栈的元素。
	tmp[0] = "西瓜1"; tmp[1] = "西瓜2";  sv.push(tmp);
	// 第三个入栈的元素。
	tmp[0] = "冰冰1"; tmp[1] = "冰冰2";   tmp[2] = "冰冰3";  tmp[3] = "冰冰4";  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;
	}
            
	// 创建Vector容器,容器中的元素用Vector<string>。
	Vector<Vector<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;
	}
}

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt


网站公告

今日签到

点亮在社区的每一天
去签到