筆記六:基於數組的棧的實現

定義後進先出的數據結構

實現一:基於數組表示的線性表的派生棧的實現。
原理:把線性表的插入和刪除操作限制在同一端進行,即得到棧的表現形式。
操作:把數組線性表的右端定義爲棧頂。
代碼:

template<typename T> 
class stack
{
public:
    virtual ~stack() {};
    virtual bool empty() const = 0;
    virtual int size() const = 0;
    virtual T& top() = 0;
    virtual void pop() = 0;
    virtual void push(const T& theElement) = 0;
};

template<typename T>
class derivedArrayStack : private arrayList<T>, public stack<T>
{
public:
    derivedArrayStack(int initialCapacity = 10) : arrayList<T>(initialCapacity) {}
    bool empty() const { return arrayList<T>::empty(); }
    int size() const { return arrayList<T>::size(); }
    T& top() {
         if (arrayList<T>::size() - 1 < 0)
         {
             cout << "當前棧爲空棧!" << endl;
             exit(-1);
         }
        return arrayList<T>::get(arrayList<T>::size() - 1);
    }
    void pop() {
        if (arrayList<T>::size() - 1 < 0)
        {
            cout << "當前棧爲空棧,不能進行刪除操作!" << endl;
            exit(-1);
        }
        arrayList<T>::erase(arrayList<T>::size() - 1); }
    void push(const T& theElement) { arrayList<T>::insert(arrayList<T>::size(), theElement); }
};

實現二:不以arrayList作爲基類,直接實現數組型棧
操作:定義一個指向棧頂的標記stackTop,棧容量標記stackLength和存儲數組元素的指針。
代碼:

template<typename T>
class arrayStack : public stack<T>
{
public:
    arrayStack(int initialCapacity = 10);
    ~arrayStack() { delete[] stk; }
    bool empty() const { return stackTop == -1; }
    int size() const { return stackTop + 1; }
    T& top();
    void pop();
    void push(const T& theElement);
private:
    int stackTop;   //當前棧頂
    int arrayLength;    //棧容量
    T*  stk;        //元素數組
};

template<typename T>  arrayStack<T>::arrayStack(int initialCapacity)
{
    stackTop = -1;
    arrayLength = initialCapacity;
    stk = new T[arrayLength];
}

template<typename T> T& arrayStack<T>::top()
{
    if (stackTop == -1)
    {
        cout << "當前棧爲空棧!" << endl;
        exit(-1);
    }

    return stk[stackTop];
}

template<typename T> void arrayStack<T>::pop()
{
    if (stackTop == -1)
    {
        cout << "當前棧爲空棧!" << endl;
        return ;
    }

    //T* curr = stk[stackTop];
    int delTop = stackTop;
    --stackTop;
    stk[delTop].~T();
}

template<typename T> void arrayStack<T>::push(const T& theElement)
{
    if (stackTop == arrayLength - 1)    //達到棧容量,增加棧容量
    {
        T *tmp = new T[arrayLength * 2];
        copy(stk, stk + stackTop, tmp);
        stk = tmp;
        arrayLength = arrayLength * 2;
    }
    stk[++stackTop] = theElement;

}



main()函數:

int main(int argc, char *argv[])
{
    derivedArrayStack<int> DAS;
    DAS.push(5);
    cout << "將元素5入棧後,棧的大小:" << DAS.size() << endl;

    DAS.push(4);
    cout << "將元素4入棧後,棧的大小:" << DAS.size() << endl;

    cout << "返回棧頂元素:" << DAS.top() << "  size = "<<DAS.size()<<endl;

    DAS.pop();
    cout << "刪除棧頂元素後新的棧頂元素爲:" << DAS.top() << "  size =  " << DAS.size() << endl;

    cout << "\n**********************\n" << endl;

    arrayStack<int> AS;
    AS.push(5);
    cout << "將元素5入棧後,棧的大小:" << " size: "<<AS.size() << endl;

    AS.push(4);
    cout << "將元素4入棧後,棧的大小:" << AS.size() << endl;

    cout << "返回棧頂元素:" << AS.top() << "  size = " << AS.size() << endl;

    AS.pop();
    cout << "刪除棧頂元素後新的棧頂元素爲:" << AS.top() << "  size =  " << AS.size() << endl;

    return 0;
}

運行:

這裏寫圖片描述

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