#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;
}