1. 程式人生 > >棧的陣列實現方式

棧的陣列實現方式

   棧是一種很實用的資料結構,如果你需要自己寫一個計算器,或者你需要探究以下遞迴函式在計算機中是怎麼執行的,那麼你先得對棧這種資料結構有一定的瞭解。

棧其實也是一種線性表,相比於普通的線性表,棧加了一定的限制,即只能在線性表的一端進行插入和刪除,我們在實現棧的時候,從線性表類中派生也是一種不錯的方法,不過考慮到棧作為計算機中最常用的資料結構之一,派生會導致程式碼的執行效率降低,所以如何實現棧,取決於實際的情況。
下面的程式碼是用陣列實現棧的一種方式,可直接在編譯器中編譯,執行。

#include<iostream>
using namespace std;
//先實現資料抽象類,然後再從抽象類中派生。
/*
   棧的基本操作:
   出棧
   入棧
   返回棧頂元素
   輔助操作:
   判斷棧空
   返回棧中元素個數
*/
template<class T>
class stack{
    public:
        virtual ~stack(){
        };
        virtual bool empty()const=0;
        virtual int size()=0;
        virtual void pop()=0;
        virtual T top()=0;
        virtual void push(const T& element)=0;
};
/*
    目前使用兩種方式來實現棧:
    1:陣列
    2:種是連結串列。
*/
//陣列實現方式
template<class T>
class cArrayStack : public stack<T>{
    private:
        int stackTop;
        int length;
        T *stack;
    public:
        cArrayStack(int initialSize=10);
        ~cArrayStack(){delete[] stack;}
        bool empty()const{return stackTop==-1;}
        int size() {return stackTop+1;}
        T top()
        {
            if(stackTop==-1)
            {
                cout<<"棧已空"<<endl;
                return (T)NULL;
            }
            return stack[stackTop];
        }
        void pop()
        {
            if(stackTop==-1)
            {
                cout<<"棧已空"<<endl;
            }
            stackTop--;
        }
        void push(const T& element);

};
template<class T>
cArrayStack<T>::cArrayStack(int initialSize)
{
    if(initialSize<1)
    {
        cout<<"初始長度必須大於0"<<endl;
    }
    length=initialSize;
    stack=new T[length];
    stackTop=-1;
}
template<class T>
void cArrayStack<T>::push(const T& element)
{
    if(stackTop==(length-1))
    {
        cout<<"棧已滿,壓入失敗"<<endl;
    }
    stackTop++;
    stack[stackTop]=element;
}
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    cArrayStack<int> Stack(10);
    for(int i=0;i<10;i++)
    {
        cout<<a[i]<<"\t";
        Stack.push(a[i]);
    }
    cout<<endl;
    while(!Stack.empty())
    {
        cout<<Stack.top()<<"\t";
        Stack.pop();
    }
    return 0;
}