用模板封装栈,并且栈内可存放任意数据类型
#include <iostream>
using namespace std;
template<typename T>
class MyStack
{
private:
int Top; // 栈顶位置
int Size; // 栈大小
T *Arr; // 数组本体
public:
MyStack() : Size(0), Top(-1), Arr(nullptr) { cout << "默认构造" << endl; }
MyStack(int size) : Size(size), Top(-1)
{
Arr = new T[size];
cout << "参数构造" << endl;
}
~MyStack()
{
delete[] Arr;
cout << "析构" << endl;
}
// 深拷贝赋值运算符重载
MyStack &operator=(const MyStack &src)
{
if (this != &src)
{
delete[] Arr; // 删除原数组
Top = src.Top;
Size = src.Size;
Arr = new T[Size];
// 复制数组
for (int i = 0; i <= Top; i++)
{
Arr[i] = src.Arr[i];
}
}
return *this;
}
// 获取栈顶元素
T top()
{
if (empty())
{
cout << "栈空" << endl;
exit(1);
}
return Arr[Top];
}
// 判断是否为空
bool empty()
{
return Top == -1;
}
// 获取栈大小
int size()
{
return Top + 1;
}
// 入栈
void push(const T &val)
{
if (Top == Size - 1)
{
cout << "栈满" << endl;
return;
}
Arr[++Top] = val;
}
// 出栈
T pop()
{
if (empty())
{
cout << "栈空" << endl;
exit(1);
}
return Arr[Top--];
}
};
int main()
{
MyStack<int> s1(10);
if (s1.empty())
cout << "栈空" << endl;
s1.push(1);
s1.push(2);
s1.push(3);
MyStack<int> s2 = s1;
cout << s2.pop() << endl;
cout << s2.pop() << endl;
cout << s2.pop() << endl;
cout << s2.pop() << endl; // 栈空
return 0;
}