栈的基本操作

来源:互联网 发布:战千雄源码 编辑:程序博客网 时间:2024/04/30 09:45

栈的特点:先进后出

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