棧的陣列實現方式
阿新 • • 發佈:2018-12-23
棧是一種很實用的資料結構,如果你需要自己寫一個計算器,或者你需要探究以下遞迴函式在計算機中是怎麼執行的,那麼你先得對棧這種資料結構有一定的瞭解。
棧其實也是一種線性表,相比於普通的線性表,棧加了一定的限制,即只能在線性表的一端進行插入和刪除,我們在實現棧的時候,從線性表類中派生也是一種不錯的方法,不過考慮到棧作為計算機中最常用的資料結構之一,派生會導致程式碼的執行效率降低,所以如何實現棧,取決於實際的情況。
下面的程式碼是用陣列實現棧的一種方式,可直接在編譯器中編譯,執行。
#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; }