1. 程式人生 > >筆記六:基於陣列的棧的實現

筆記六:基於陣列的棧的實現

定義後進先出的資料結構

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

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

執行:

這裡寫圖片描述