La plantilla de clase implementa la pila secuencial

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Problemas existentes:

Solución 1:

Problemas de las plantillas de clases de C ++ en la escritura de subarchivos

Solución 2:

Inserte la descripción de la imagen aquí
El siguiente es el código de demostración del segundo método:
main.cpp

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
#include "标头.h"
//测试代码--------------------------------
void test()
{
    
    
	//测试
	double p[3] = {
    
     1,2,3 };
	//初始化栈
	doubleStack s1(4);
	//入栈
	try {
    
    
		s1.push(p[0]);
		s1.push(p[1]);
		//此时栈内只能放下两个元素,那么因为可以对异常进行捕获
		//所以当要放入第三个元素的时候,会引起异常,去到下面的catch块中寻找对应的捕获类型
		s1.push(p[2]);
		//当还要插入第四个元素时,因为插入第三个元素时,已经抛出异常,所以语句3下面的语句不会执行
		s1.push(p[2]);
	}
	//catch(异常类型),异常类型就是定义的异常内部类的类名
	catch (doubleStack::Full)
	{
    
    
		cout << "FULL!!" << endl;
	}

	try
	{
    
    
		//返回栈顶元素进行输出
		double p1 = s1.getTop(); 
		cout << p1 << endl;
		s1.pop();
		//返回栈顶元素进行输出
		double  p2 = s1.getTop();
		cout << p2 << endl;
		s1.pop();
	}
	catch (doubleStack::Empty)
	{
    
    
		cout << "Empty!!" << endl;
	}

}
int main()
{
    
    
	test();
	system("pause");
	return 0;
}

stack.h

#pragma once
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
//定义栈的最大值常量
const int MAX = 1024;
//c++实现顺序栈
//DataType用来指定,指向栈数组的类型
template<class DataType>
class stack
{
    
    
private:
	//用一个void**的指针指向一个存放void*类型指针的数组
	DataType* data; //用来指向栈的数组
	int size; ///栈的大小
	int top; //栈顶:当前栈内元素个数
public:
	stack(); //无参构造
	stack(int size);//有参构造
	~stack();//析构函数
	void push(DataType val);//入栈
	void pop();//出栈
	DataType getTop();//获得栈顶元素
	bool isEmpty();//栈是否为空
	bool isFull();//栈是否已满
	void setNull();//设置栈为空
	//定义异常内部类(类嵌套类)
	class Empty {
    
    };
	class Full {
    
    };
};

//为每个类型的模板起一个别名
typedef stack<char>  charStack;
typedef stack<double>  doubleStack;

stack.cpp

#include "标头.h"
template<class DataType>
stack<DataType>::stack()
{
    
    
	cout << "无参构造函数调用" << endl;
	size = MAX; //大小为最大
	top = -1;//栈初始化时没有元素
	//该数组里面存放的是void*指针
	data = new DataType[MAX];//缺省构造函数分配最大内存空间
}
template<class DataType>
stack<DataType>::stack(int size)
{
    
    
	cout << "有参构造函数调用" << endl;
	this->size = size;//用户指定大小
	top = -1;//初始化时没有元素
	//该数组里面存放的是void*指针
	data = new DataType[size];//有参构造函数用户指定大小
}
template<class DataType>
stack<DataType>::~stack()
{
    
    
	cout << "析构函数" << endl;;
	delete[] data; //内存回收
}
template<class DataType>
void stack<DataType>::push(DataType val)
{
    
    
	if (val == NULL)
		return;
	//入栈:尾插
	//每次入栈的时候先判断栈是否已满

	//当堆栈为满的时候,丢出Full异常
	if (isFull())
	{
    
    
		//匿名函数对象
		throw Full();
		return;
	}
	else
	{
    
    
		//更新top的位置,插入数据后top的值就是当前栈中元素的个数
		data[++top] = val;
	}
	//如果栈满了,可以用异常捕获的操作

}
template<class DataType>
void stack<DataType>::pop()
{
    
    
	//如果栈为空,丢出Empty异常
	if (isEmpty())
	{
    
    
		//丢出Empty()的匿名函数对象
		throw Empty();
		return;
	}
	else
	{
    
    
		//先返回当前出栈的元素,再将top当前栈元素的数量减一
		--top;
	}

}
template<class DataType>
DataType stack<DataType>::getTop()
{
    
    
	if (!isEmpty())
	{
    
    
		return data[top];
	}
	return NULL;
}
template<class DataType>
bool stack<DataType>::isFull()
{
    
    
	if (top + 1 == size)
		return true;
	return false;
}
template<class DataType>
bool stack<DataType>::isEmpty()
{
    
    
	if (top == -1)
		return true;
	return false;
}
template<class DataType>
void stack<DataType>::setNull()
{
    
    
	top = -1;
}
//显示的声明要使用的模板类实例
template class stack<char>;
template class stack<double>;

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_53157173/article/details/114449496
Recomendado
Clasificación