类模板常当作容器使用
一、普通类的栈,只支持整型
代码
#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;
运行结果
四、总结
新手不要一上来就写出一个模板类,模板类不好调试修改;