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
    评论
类模板C++ 中的一种特殊类型,它允许您编写通用类,以适用于多个不同的数据类型。类模板中的成员函数和数据成员可以使用任何数据类型。使用类模板可以有效地减少重复的代码量,并且可以提高代码的可读性和可维护性。 下面是一个(stack)类的类模板示例,用于实现基本的功能: ``` template <class T> class Stack { private: T* stackArray; // 存储元素的数组指针 int stackSize; // 的最大大小 int top; // 顶元素的索引 public: // 构造函数 Stack(int size) { stackArray = new T[size]; stackSize = size; top = -1; } // 析构函数 ~Stack() { delete [] stackArray; } // 压操作 void push(T value) { if (top == stackSize - 1) { cout << "Stack is full!\n"; } else { top++; stackArray[top] = value; } } // 弹操作 void pop() { if (isEmpty()) { cout << "Stack is empty!\n"; } else { top--; } } // 返回顶元素值 T peek() { if (isEmpty()) { cout << "Stack is empty!\n"; return T(); } else { return stackArray[top]; } } // 判断是否为空 bool isEmpty() { return top == -1; } // 判断是否已满 bool isFull() { return top == stackSize - 1; } }; ``` 在此示例中,我们使用了类模板 `template <class T>`,其中 `T` 是通用数据类型的占位符。这个占位符可以被任何数据类型替换。例如,如果您想要创建一个存储整数类型的,则可以这样声明: ``` Stack<int> intStack(10); ``` 其中 `int` 是替换 `T` 的实际数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值