嵌套和递归使用模板类
- 模板栈
- 模板数组
- 栈中嵌套数组
- 数组中嵌套栈
- 数组中嵌套数组
模板栈
#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;
}