栈的特点:先进后出
#include<iostream>
#include<assert.h>
using namespace std;
template<class T>
class Stack
{
public:
Stack(size_t capacity = 10)//构造函数
:_capacity(capacity)
,_size(0)
{
_pData=new T[capacity];
}
Stack(const Stack<T>& s)//拷贝构造函数
:_pData(NULL)
,_size(s.Size())
,_capacity(s._capacity)
{
_pData=new T[capacity];
for(size_t i=0;i<s.Size();i++)
{
_pData[i]=s._pData[i];
}
}
Stack<T>& operator=(const Stack<T>& s)//赋值运算符重载
{
if (this != &s)
{
_capacity = _capacity * 2 + 3;
T * tmp = new int[s._capacity];
for (size_t i = 0; i < s._size; ++i)
{
_pData[i] = s._pData[i];
}
delete _pData;
_pData = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
void Push(const T& x)//入栈
{
_CheckCapacity();//检测栈的容量
_pData[_size++]=x;
}
void Pop()//出栈
{
assert(!Empty());
--_size;
}
size_t Size()const//栈中元素的个数
{
return _size;
}
T& Top()//取栈顶元素
{
return _pData[_size-1];
}
const T& Top()const
{
return _pData[_size-1];
}
bool Empty()//判断栈是否空
{
return 0==_size;
}
private:
void _CheckCapacity()//检测栈的容量
{
if(_size>=_capacity)
{
// 申请空间
T* temp = new int[2*_capacity+3];
// 拷贝元素
//memcpy(); 缺点:浅拷贝 有点:速度快
//memcopy(temp,_pData,sizeof(T)*_size);
for(size_t i=0;i<_size;i++)
{
temp[i]=_pData[i];
}
// 释放旧空间
delete[] _pData;
// 指向新空间
_pData=temp;
_capacity *= 2;
}
}
private:
T* _pData;
size_t _capacity;
size_t _size;
};
int main()
{
Stack<int> s;
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
s.Push(5);
s.Push(6);
s.Push(7);
s.Push(8);
s.Push(9);
s.Push(10);
cout<<s.Size()<<endl;
cout<<s.Empty()<<endl;
s.Pop();
cout<<s.Size()<<endl;
cout<<s.Top()<<endl;
}