模拟实现 栈

来源:互联网 发布:软件开发的文档 编辑:程序博客网 时间:2024/05/16 07:37

栈:只允许在栈顶进行删除和插入操作的顺序表。(FILO,先进后出)
如下图:
这里写图片描述
在栈里面有以下几项基本操作:
pop()//删除栈顶数据
push(data)//在栈顶插入一个数据data
top()//返回栈顶元素
size()//返回栈中元素的个数
empty()//判断栈是否为空

下面进行代码实现:

#include<iostream>using namespace std;template <typename T>class Stack{protected:    T* _a;//存储数据    int _size;//数据个数    int _capacity;//容量public:    Stack()//构造函数        :_a(NULL)        ,_size(0)        ,_capacity(0)    {}    Stack(const Stack<T>& S)//拷贝构造函数        :_size(S._size)        ,_capacity(S._capacity)    {        T* tmp = new T[S._capacity];        for(size_t i = 0; i < S._size; i++)        {            tmp[i] = S._a[i];        }        _a = tmp;    }    ~Stack()//析构函数    {        delete[] _a;        _a = NULL;    }    void Push(const T& data)//插入    {        _ChackCapacity();//判断容量是否够用        _a[_size] = data;        _size++;    }    void Pop()//删除    {        if(_size)        {            _size--;        }    }    T& Top()//返回栈顶元素    {        if(_size)        {            return _a[_size-1];        }    }    int _Size()//返回元素个数    {        return _size;    }    bool Empty()//判断栈是否为空    {        return !(_Size());    }    int _Capacity()//返回栈容量    {        return _capacity;    }protected:    void _ChackCapacity()//增容    {        if(_size >= _capacity)        {            //NewCpacity为新的容量            int NewCpacity = _capacity*2+3;//因为_capacity的初始值为0,所以这里加3            T* tmp = new T[NewCpacity];//new 一块大小为NewCpacity的空间            for(size_t i = 0; i < _size; i++)//将原先那块空间里的元素拷贝到新的空间里            {                tmp[i] = _a[i];            }            delete[] _a;//释放旧的空间            _a = tmp;//让_a指向新的空间;            _capacity = NewCpacity;//改变容量大小        }    }};int main(){    Stack<int> s;//构建一个整型的对象    //插入1,2,3,4,5,6,六个对象    s.Push(1);    s.Push(2);    s.Push(3);    s.Push(4);    s.Push(5);    s.Push(6);    //删除栈顶元素    s.Pop();    s.Pop();    s.Pop();    cout<<"容量:"<<s._Capacity()<<endl<<endl;//返回栈的容量    cout<<"元素数量:"<<s._Size()<<endl<<endl;//返回栈中元素的数量    s.Empty();//判断栈是否为空    cout<<"栈中元素:";    while(s._Size())//输出栈中元素    {        cout<<s.Top()<<" ";        s.Pop();    }    cout<<endl<<endl;    return 0;}

结果:
这里写图片描述
因为在栈中只能访问栈顶元素,所以先打印栈顶元素,然后再将其删除,让倒数第二个数成为栈顶元素,在进行打印,以此类推。
缺点是在打印完元素栈也被清空了。

0 0
原创粉丝点击