用模板来实现一个顺序栈//类模板
#include <iostream>
#include <cstring>
template<typename T>
class SeqStack//模板名称+类型参数列表 = 类名称
{
public:
//构造与析构函数名不用加<T>,其他出现模板的地方都加上类型参数列表
SeqStack(int size = 10)
: _pstack(new T[size])
, _top(-1)
, _size(size)
{ }
~SeqStack()
{
delete[]_pstack;
_pstack = nullptr;
}
SeqStack(const SeqStack<T> &src)
: _top(src._top)
, _size(src._size)
{
_pstack = new T[src._size];
for (int i = 0; i <= _top; ++i)
{
_pstack[i] = src._pstack[i];
}
}
SeqStack<T>& operator=(const SeqStack<T> &src)
{
if (this == &src)
{
return *this;
}
delete[]_pstack;
_top = src._top;
_size = src._size;
_pstack = new T[_size];
for (int i = 0; i <= _top; ++i)
{
_pstack[i] = src._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];
}
bool full()const
{
return _top == size - 1;
}
bool empty()const
{
return _top = -1;
}
private:
T* _pstack;
int _top;
int _size;
//顺序栈底层数组二倍方式进行扩容
void resize()
{
T *ptmp = new T[2 * _size];
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())
{
resize();
}
_pstack[++_top] = val;
}
int main()
{
//类模板的选择性实例化
SeqStack<int> s1;//用整型实例化类模板
//class SeqStack<int>{ };模板类
s1.push(20);
s1.push(78);
s1.push(32);
s1.push(56);
s1.pop();
cout << s1.top() << endl;
return 0;
}
231

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



