資料結構基礎知識(四)
阿新 • • 發佈:2018-12-10
順序表
3.棧
棧是一種特殊的線性表。在邏輯結構和儲存結構上,棧與一般的線性表沒有什麼區別,但是對於允許的操作卻加以限制,棧的插入和刪除操作只允許在表尾的一端進行,因此,棧是操作受限的線性表。
(1)棧的抽象資料型別以及實現
棧中資料元素的型別都相同,稱為棧元素。往棧裡插入一個元素稱為進棧(push),從棧裡刪除一個元素為出棧(pop)。棧也稱為後進先出表(LIFO)。
棧中插入和刪除的一端稱為棧頂,另一端則稱為棧底。棧底固定不動,棧頂不斷變化。不含棧元素的棧稱為空棧。
棧頂指標(top),總是指向最後一個進棧的棧元素。存放棧元素的陣列稱為棧空間,這片空間可以靜態分配,也可以動態生成。
用類表示的棧的抽象資料型別如下:
template <class T> class Stack { private: int top; //棧頂指標 T *elements; //存放棧元素的陣列 int MaxSize; public: Stack(int MaxSize =defaultsize); //建立棧空間,生成一個空棧 ~Stack(void){delete[]elements;} //釋放棧空間 int Push(const T& item); T Pop(void); T GetTop(void); void MakeEmpty(void){top= -1;} boolean IsEmpty(void)const{return boolean(top== -1);} boolean IsFull(void)const{return boolean(top ==MaxSize-1);} };
template<class T>
Stack<T>::Stack(int s)
{
MaxSize = s;
elements = new T[MaxSize]; //建立棧空間
top = -1; //生成一個空棧
}
進棧Push():
template<class T> int Stack<T>::Push(const T& item) //進棧,若棧不滿,則item進棧,返回0;否則返回-1; { if (!IsFull()){elements[++top]=item;return 0;} else return -1; }
出棧Pop(void):
template<class T>
Stack<T>::Pop(void) //出棧,若棧非空,則棧頂元素出棧,返回其值;否則返回NULL。
{
if (!IsEmpty())return elements[top--];
else return NULL;
}
讀棧頂元素:
template<class T>
T Stack<T>::GetTop(void)
{ //讀棧頂。若棧非空,則返回棧頂元素的值;否則返回NULL。
if (!IsEmpty())return elements[top];
else return NULL;
}