使用类模板实现一个栈
包括拷贝构造、入栈、出栈、返回栈顶元素、判断栈是否为空为满
#include <iostream>
using namespace std;
template<typename T>
class SeqStack //模板名称 + 类型参数列表 = 类名称
{
public:
//构造和析构函数名不用加<T>类型参数化列表 其他出现模板的地方都要加上类型参数化列表
SeqStack(int size = 10)
: _pstack(new T[size])
, _top(0)
, _size(size)
{}
~SeqStack()
{
delete[]_pstack;
_pstack = nullptr;
}
//拷贝构造函数
SeqStack<T>(const SeqStack<T>& stack)
:_top(stack._top)
, _size(stack._size)
{
_pstack = new T[_size];
//这里不要使用memcopy进行拷贝 可能会导致浅拷贝
for (int i = 0; i < _top; ++i)
{
_pstack[i] = stack._pstack[i];
}
}
//赋值运算符重载
//确保在将一个SeqStack对象赋值给另一个对象时,不仅简单复制指针值还需要深拷贝数据
SeqStack<T>& operator=(const SeqStack<T>& stack)
{
//防止自赋值
if (this == &stack)
return *this;
//删除原来空间
delete[] _pstack;
//赋值操作
_top = stack._top;
_size = stack._size;
_pstack = new T[_size];
for (int i = 0; i < _top; ++i)
{
_pstack[i] = stack._pstack[i];
}
return *this;
}
//入栈操作
void push(const T& val);
//出栈操作
void pop()
{
if (empty())
return;
--_top;
}
//返回栈顶元素
T top()const
{
if (empty())
throw "stack is empty!";
return _pstack[_top - 1];
}
//判断是否为满
bool full() const
{
return _top == _size;
}
//判断是否为空
bool empty() const
{
return _top == 0;
}
private:
T *_pstack;
int _top;
int _size;
//底层栈底按2倍顺序扩容
void expand()
{
T* ptmp = new T[_size * 2];
for (int i = 0; i < _top; ++i)
{
ptmp[i] = _pstack[i];
}
delete[]_pstack;
_pstack = ptmp;
_size *= 2;
}
};
//类外实现
template<typename T>
void SeqStack<T>::push(const T &val)
{
if (full())
{
expand();
}
_pstack[_top++] = val;
}
int main()
{
SeqStack<int>s1;
s1.push(20);
s1.push(78);
s1.push(32);
s1.push(15);
s1.pop();
cout << s1.top() << endl;
return 0;
}
438

被折叠的 条评论
为什么被折叠?



