0
点赞
收藏
分享

微信扫一扫

c++自定义栈

艾米吖 2022-03-13 阅读 48
c++
#include<iostream>
using namespace std;

template <typename Type>
class MyStack
{
public:
	MyStack(int size);//初始化是要指定stack的大小
	~MyStack();

	bool isEmpty();
	bool isFull();
	int size();

	int pushStack(Type model);
	Type topStack();
	int popStack(Type* popResult);




private:
	Type *stk;//栈是由动态数组实现的,stk表示数组的首地址
	int top;//始终指向栈顶元素,是栈顶元素在动态数组中的下标值
	int MAXN;//栈的最大容量
};

template <typename Type>
//注意要加上尖括号模板类型
MyStack<Type>::MyStack(int size)
{
	top = -1;
	MAXN = size;
	stk = new Type[MAXN];
}

template<typename Type>
MyStack<Type>::~MyStack()
{
	delete stk;
}

template<typename Type>
bool MyStack<Type> :: isEmpty()
{
	//小学生代码
	//if (top == -1) return true;
	//return false;

	//优化
	return top == -1;
}

template<typename Type>
bool MyStack<Type> ::isFull()
{
	return top == MAXN - 1;
}

template<typename Type>
int MyStack<Type> ::size()
{
	return top+1;
}


template<typename Type>
int MyStack<Type> :: pushStack(Type model)
{
	//入栈时要判断栈已经满了,无法插入的情况,所以要带返回值
	if (isFull()) return -1;
	stk[++top] = model;
	return 0;
}

template<typename Type>
Type MyStack<Type> ::topStack()
{
	if (isEmpty()) return -1;
	return stk[top];
}

//pop失败返回整形数据int,成功返回弹出的数据,弹出的数据类型可能不是整形,
//所以这里要返回值要带两个属性1.pop的数据2.pop操作是否成功,成功可以没有固定返回,失败必须返回失败值
template<typename Type>
int MyStack<Type> ::popStack(Type* popResult)
{
	if (isEmpty()) return -1;
	*popResult = stk[top--];
	return 0;//可以注释
}

int main()
{
	MyStack<int>testStack(20);
	std::cout << "是否是空栈:" << testStack.isEmpty() << std::endl;
	testStack.pushStack(1);
	testStack.pushStack(2);
	testStack.pushStack(3);
	testStack.pushStack(4);
	testStack.pushStack(5);
	testStack.pushStack(6);

	std::cout << "栈内有几个元素:" << testStack.size() << std::endl;
	std::cout << "栈顶元素是:" << testStack.topStack() << std::endl;
	int temp = 0;
	testStack.popStack(&temp);
	std::cout << "弹出元素是:" << temp << std::endl;
	std::cout << "栈内有几个元素:" << testStack.size() << std::endl;

}

 

举报

相关推荐

0 条评论