本文部分图片截取自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 >。
如何使用类模板对象
下面,举堆栈的例子来说明类模板的使用。 需要注意,这里是将他们都写在一起了。
#include <iostream>
using namespace std;
const int MAX_SIZE = 5;
template <class DataType>
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 {};
};
template <class DataType>
Stack<DataType>::Stack() {
size = MAX_SIZE;
top = -1;
data = new DataType[MAX_SIZE];
}
template <class DataType>
Stack<DataType>::Stack(int s) {
size = s;
top = -1;
data = new char[size];
}
template <class DataType>
Stack<DataType>::~Stack() {
delete[]data;
}
template <class DataType>
void Stack<DataType>::push(DataType ch)
{
if (isFull())
throw Full();
else
data[++top] = ch;
}
template <class DataType>
DataType Stack<DataType>::getTop()
{
if (isEmpty())
{
return -1;
}
return data[top];
}
template <class DataType>
bool Stack<DataType>::isFull()
{
return (top == (size - 1));
}
template <class DataType>
bool Stack<DataType>::isEmpty()
{
return (top == -1);
}
template <class DataType>
DataType Stack<DataType>::pop()
{
if (isEmpty())
throw Empty();
else
return data[top--];
}
template <class DataType>
void Stack<DataType>::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<char> 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<char>::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<char>::Empty)
{
cout << "Stack Empty" << endl;
}
Stack<int> 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<int>::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<int>::Empty)
{
cout << "Stack Empty" << endl;
}
system("pause");
return 0;
}
假设我们将他们分成几个文件来实现的话,可能会报错,解决方法是需要按照下面去做。
|