模板类实现数组,可变数组,栈,嵌套使用

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& operator =(const Stack& v) {
		delete []items;//释放原来内存
		stacksize= v.stacksize;//实际栈的大小
		items = new DataType[stacksize];//重新分配数组
		for (int i = 0; i < stacksize; i++) {
			items[i] = v.items[i];
		}
		top = v.top;
		return *this;
	}


	~Stack() {
		delete []items;
		items = nullptr;
	}
	//判断栈是否为空
	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;
	}

};
/*
int main() {
	Stack<string>  ss=Stack<string>(5);
	ss.push("tom");
	ss.push("jack");
	ss.push("mary");
	ss.push("smith");
	ss.push("likuo");
	元素的出栈
	string item;
	while (ss.isEmpty() == false) {
		ss.pop(item);
		cout << "出栈 item= " << item << endl;
	}
}
*/

模拟数组容器
#include<string.h>
template <class T,int len=10>
class Array {
private:
	//数组元素
	T items[len];
public:
	Array() {
	}
	~Array() {}
	//重载操作符[] 可以修改数组元素
	T& operator[](int ii) {
		return items[ii];
	}

	//重载操作符[] 不可以修改数组元素
	const T& operator[](int ii) const{
		return items[ii];
	}
};
//变长数组
template <class T>
class Vector {
private:
	int len;//数组元素大小
	//数组元素
	T* items;
public:
	Vector(int size=2) :len(size){//创建一个大小为size的数组
		items = new T[len];
	}

	//重写赋值运算 实现深拷贝
	Vector& operator =(const Vector& v) {
		delete[]items;//释放原来内存
		len = v.len;//实际Vector的大小
		items = new T[len];//重新分配数组
		for (int i = 0; i < len; i++) {
			items[i] = v.items[i];
		}
		
		return *this;
	}
	~Vector() {
		delete[]items;
		items = nullptr;
	}

	//扩展数组的大小
	void resize(int size){
		if (size <= len)return;//小于等于该数组大小就返回不扩展
		T* temp = new T[size];
		//把之前数组的内容拷贝到这个数组
		for (int i = 0; i < len; i++) {
			temp[i] = items[i];
		}
		//销毁items
		delete[]items;
		items = temp;//让新数组指向旧数组
		len = size;//数组成员变量的值也要变化
	}

	//获得数组长度
	int size() {
		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(){
	 //Array<string> arr = Array<string>();
	 Vector<int> arr(1);
	 //for (int i = 0; i < 5; i++) {
		// arr[i] = "zhansan";
		// cout << "arr["<<i<<"] = " << arr[i] << endl;
	 //}
	 //Vector默认2 Stack默认3
	 //Vector<Stack<string>> vs;
	 //vs[0].push("zhangsan1");
	 //vs[0].push("zhangsan2"); 
	 //vs[0].push("zhangsan3");
	 //vs[1].push("李四1");
	 //vs[1].push("李四2");
	 //vs[1].push("李四3");
	 //vs[2].push("sdasdas");


	 //for (int i = 0; i < vs.size(); i++) {
		// //循环输出栈里面的内容
		// while (vs[i].isEmpty() == false) {
		//	 string item;
		//	 vs[i].pop(item);
		//	 cout << "item=  " << item << endl;
		// }
	 //}


	 //创建一个Stack容器 里面中的元素用Vector<string>
	 Stack < Vector<string> >sv;
	 Vector<string> temp;
	 temp[0] = "西施", temp[1] = "西瓜";
	 sv.push(temp);
	 temp[0] = "西施1", temp[1] = "西瓜1"; 
	 sv.push(temp);
	 temp[0] = "西施2", temp[1] = "西瓜1",temp[2]="黄瓜",temp[3]="木瓜"; 
	 sv.push(temp);
	 while (sv.isEmpty() == false) {
		 Vector<string> vr;
		 sv.pop(vr);
		 for (int i = 0; i < vr.size(); i++) {
			 cout << "vr[" << i << "] = " << vr[i] << endl;
		 }
	 }

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值