C++类模板的示例-栈

类模板常当作容器使用

一、普通类的栈,只支持整型

代码

#include <iostream>
using namespace std;

class Stack//栈类
{
private://3个成员变量
	int *items;//栈数组,栈的元素用整数数组存放,动态分配一块数组空间
	int stacksize;//栈大小,栈的大小用成员变量表示
	int top;//栈顶指针,栈顶指针用整数表示,不是C++的指针
public://成员函数 
	//构造函数:1)分配栈数组空间;2)把栈顶指针初始化为0
	Stack(int size):stacksize(size),top(0)//需要一个参数(栈的大小),采用初始化列表对成员赋值
	{
		items=new int [stacksize];//在构造函数中,给栈数组分配内存
	}
	~Stack()//析构函数,释放数组空间
	{
		delete []items;//释放数组空间
		items=NULL;//指针置为空
	}
	bool isempty()const{	//判断栈是否为空
		return top==0;
	}
	bool isfull()const{		//判断栈是否为满
		return top==stacksize;
	}
	bool push(const int& item){		//元素入栈
		if(top<stacksize)//如果还没有在栈顶
		{
			items[top++]=item;
			return true;
		}
		return false;
		}
	bool pop(int& item){		//元素出栈
		if(top>0)
		{
			item=items[--top];
			return true;
		}
		return false;
	}		
};
	

int main()
{
	Stack ss(5);//创建栈对象,大小是5
	ss.push(1);//元素入栈,顺序为1 2 3 4 5
	ss.push(2);
	ss.push(3);
	ss.push(4);
	ss.push(5);
	
	int item;
	while(ss.isempty()==false)//用一个循环控制出栈,条件是栈不为空
	{
		ss.pop(item);
		cout<<"item="<<item<<endl;//出栈并显式元素
	}
	return 0;
}

运行结果

二、不使用类模板的方式,使用typedef自定义类型,实现栈支持其他数据结构

代码

#include <iostream>
using namespace std;
typedef string DataType;//定义栈元素的数据类型,后续不用具体的数据类型,而是使用DataType表示
//这么做的好处是如果要修改栈的数据类型,其他的代码不用修改,只要修改DataType就可以了
class Stack			//栈类
{
private:				//3个成员变量
	DataType *items;	//栈数组,栈的元素用整数数组存放,动态分配一块数组空间
	int stacksize;	//栈大小,栈的大小用成员变量表示
	int top;		//栈顶指针,栈顶指针用整数表示,不是C++的指针
public:	//成员函数 
	//构造函数:1)分配栈数组空间;2)把栈顶指针初始化为0
	Stack(int size):stacksize(size),top(0)	//需要一个参数(栈的大小),采用初始化列表对成员赋值
	{
		items=new DataType [stacksize];	//在构造函数中,给栈数组分配内存
	}
	~Stack()	//析构函数,释放数组空间
	{
		delete []items;	//释放数组空间
		items=NULL;	//指针置为空
	}
	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 ss(5);	//创建栈对象,大小是5
	ss.push("一");	//元素入栈,顺序为1 2 3 4 5
	ss.push("二");
	ss.push("三");
	ss.push("四");
	ss.push("五");
	
	DataType item;
	while(ss.isempty()==false)	//用一个循环控制出栈,条件是栈不为空
	{
		ss.pop(item);
		cout<<"item="<<item<<endl;	//出栈并显式元素
	}
	return 0;
}

调试步骤

①定义栈元素的数据类型,后续不用具体的数据类型,而是使用DataType表示
//这么做的好处是如果要修改栈的数据类型,其他的代码不用修改,只要修改DataType就可以了;

typedef string DataType;

②在所有用到栈元素数据类型的地方替换成DataType就可以了;

运行结果

三、模板类实现栈

代码

#include <iostream>
using namespace std;
// typedef string DataType;//定义栈元素的数据类型,后续不用具体的数据类型,而是使用DataType表示
//这么做的好处是如果要修改栈的数据类型,其他的代码不用修改,只要修改DataType就可以了
template <class DataType>//在类声明前加上模板的头部标签
class Stack			//栈类
{
private:				//3个成员变量
	DataType *items;	//栈数组,栈的元素用整数数组存放,动态分配一块数组空间
	int stacksize;	//栈大小,栈的大小用成员变量表示
	int top;		//栈顶指针,栈顶指针用整数表示,不是C++的指针
public:	//成员函数 
	//构造函数:1)分配栈数组空间;2)把栈顶指针初始化为0
	Stack(int size):stacksize(size),top(0)	//需要一个参数(栈的大小),采用初始化列表对成员赋值
	{
		items=new DataType [stacksize];	//在构造函数中,给栈数组分配内存
	}
	~Stack()	//析构函数,释放数组空间
	{
		delete []items;	//释放数组空间
		items=NULL;	//指针置为空
	}
	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(5);	//创建栈对象,大小是5
	ss.push("一");	//元素入栈,顺序为1 2 3 4 5
	ss.push("二");
	ss.push("三");
	ss.push("四");
	ss.push("五");
	
	string item;
	while(ss.isempty()==false)	//用一个循环控制出栈,条件是栈不为空
	{
		ss.pop(item);
		cout<<"item="<<item<<endl;	//出栈并显式元素
	}
	return 0;
}

调试步骤

①在类的声明前加上模板类的头部标签

template <class DataType>//在类声明前加上模板的头部标签

②在主函数中,定义类对象时,声明数据类型

Stack <string>ss(5);    //创建栈对象,大小是5

③存放栈元素的临时变量

string item;

运行结果

 四、总结

新手不要一上来就写出一个模板类,模板类不好调试修改;

①先写一个普通类的栈,用具体的数据类型;

②调试普通类;

③确定普通类功能没有问题后,把普通类改为模板类;

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值