模擬實現 棧

棧:只允許在棧頂進行刪除和插入操作的順序表。(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;
}

結果:
這裏寫圖片描述
因爲在棧中只能訪問棧頂元素,所以先打印棧頂元素,然後再將其刪除,讓倒數第二個數成爲棧頂元素,在進行打印,以此類推。
缺點是在打印完元素棧也被清空了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章