本文部分图片截取自B站懒猫老师。
视频链接为:https://www.bilibili.com/video/BV187411j7sm?spm_id_from=333.1007.top_right_bar_window_history.content.click.
使用main函数来操作:
注意点:
1、在类的前面加上template< class DataType >
2、把要数据类型替换为定义的通用数据类型
3、所有的成员函数在定义的时候,要在前面加上
template< class DataType >,
表明是和类模板相关的,然后在用到类名的的地方即“::”之前,在类名后面加上尖括号< DataType >。
下面,举堆栈的例子来说明类模板的使用。
需要注意,这里是将他们都写在一起了。
#includeusing namespace std; //栈 - 以存储字符型数据为例 const int MAX_SIZE = 5; //定义栈最大值常量 template class Stack { private: DataType* data; //成员属性:线性表 int size; //成员属性:堆栈的实际大小 int top; //成员属性:栈顶 public: Stack(); //构造函数 Stack(int s); //有参构造函数 ~Stack(); //析构函数 void push(DataType ch); //成员函数:入栈 DataType pop(); //成员函数:出栈并返回栈顶元素 DataType getTop(); //成员函数:获得栈顶元素(不出栈) bool isEmpty(); //成员函数:栈是否为空 bool isFull(); //成员函数:栈是否为满 void setNull(); //成员函数:设置栈为空 class Full {}; class Empty {}; //由于这两个类都是放在Stack这个类声明的里面, 所以我们将其称为异常内部类 }; template Stack ::Stack() { size = MAX_SIZE; top = -1; data = new DataType[MAX_SIZE]; //缺省构造函数分配最大的内存空间 } template Stack ::Stack(int s) { size = s; top = -1; data = new char[size]; //根据指定的大小分配栈的内存空间 } //析构函数 template Stack ::~Stack() { delete[]data; //内存回收--主动去实现内存的释放。 } template void Stack ::push(DataType ch) { //当堆栈是满时,丢出异常对象 if (isFull()) throw Full(); else data[++top] = ch; } template DataType Stack ::getTop() //成员函数:获得栈顶元素(不出栈) { if (isEmpty()) { return -1; } return data[top]; } template bool Stack ::isFull() //成员函数:栈是否为满 { return (top == (size - 1)); } template bool Stack ::isEmpty() //成员函数:栈是否为空 { return (top == -1); } template DataType Stack ::pop() //成员函数:出栈并返回栈顶元素 { //当堆栈是空时,丢出异常对象 if (isEmpty()) throw Empty(); else return data[top--]; //先出栈,top再自减 } template void Stack ::setNull() //成员函数:设置栈为空 { top = -1; } int main() { int i,j; char ret_char; int ret_int; char arr_char[] = { 'a','d','s' ,'4','2' }; int arr_int[] = { 1,2,3,4,5 }; Stack sqStack_char; try{ for (i = 0; i < sizeof(arr_char)/sizeof(*arr_char); i++) { sqStack_char.push(arr_char[i]); } sqStack_char.push('b'); } catch (Stack ::Full) { cout << "Stack Full" << endl; } try { ret_char = sqStack_char.pop(); cout << ret_char << endl; ret_char = sqStack_char.pop(); cout << ret_char << endl; ret_char = sqStack_char.pop(); cout << ret_char << endl; ret_char = sqStack_char.pop(); cout << ret_char << endl; ret_char = sqStack_char.pop(); cout << ret_char << endl; ret_char = sqStack_char.pop(); cout << ret_char << endl; } catch (Stack ::Empty) { cout << "Stack Empty" << endl; } Stack sqStack_int; try { for (j = 0; j < sizeof(arr_int) / sizeof(*arr_int); j++) { sqStack_int.push(arr_int[j]); } sqStack_int.push(6); } catch (Stack ::Full) { cout << "Stack Full" << endl; } try { ret_int = sqStack_int.pop(); cout << ret_int << endl; ret_int = sqStack_int.pop(); cout << ret_int << endl; ret_int = sqStack_int.pop(); cout << ret_int << endl; ret_int = sqStack_int.pop(); cout << ret_int << endl; ret_int = sqStack_int.pop(); cout << ret_int << endl; ret_int = sqStack_int.pop(); cout << ret_int << endl; } catch (Stack ::Empty) { cout << "Stack Empty" << endl; } system("pause"); return 0; }
假设我们将他们分成几个文件来实现的话,可能会报错,解决方法是需要按照下面去做。



