1. 程式人生 > >資料結構基礎知識(四)

資料結構基礎知識(四)

順序表

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