棧小結

棧是一種只允許在一端進行插入和刪除操作的線性表,棧頂是允許插入和刪除的那一端,而棧底是不允許插入和刪除的那一端
基本操作:

InitStack(&S);//初始化一個棧
StackEmpty(S);//判斷一個棧是否爲空,若爲空則返回true,否則返回false
Push(&S,x);//進棧,若棧S未滿,則將x加入使之成爲新棧頂
Pop(&S,&X);//出棧,若棧S非空,則彈出棧頂元素,並用x返回
GetTop(S,&x);//讀棧頂元素,若棧S非空,則用x返回棧頂元素
DestroyStack(&S);//銷燬棧,並釋放棧S佔用的存儲空間

在這裏插入圖片描述
棧的順序存儲結構
順序存儲類型描述

#define MaxSize 50
typedef struct
{
	Elemtype data[MaxSize];//存放棧中元素
	int top;//棧頂指針
}SqStack;		
  • 棧頂指針:初始時設置S.top=-1;棧頂元素S.data[S.top];
  • 進棧操作:棧不滿時,棧頂指針先加1,再送值到棧頂元素
  • 出棧操作:棧非空時,先取棧頂元素值,再將棧頂指針減1
  • 棧空:S.top==-1;
  • 棧滿:S.top==MaxSize-1;
  • 棧長:S.top+1

順序棧的基本運算實現

  • 初始化
void InitStack(SqStack &s)
{
	S.top=-1;
}
  • 判斷棧空
bool StackEmpty (SqStack S)
{
	if(S.top==-1)
		return true;
	else
		return false;
}
  • 進棧
bool Push(SqStack &S,ElemType x)
{
	if(S.top==MaxSize-1)//棧滿,報錯
		return false;
	S.data[++S.top]=x;
	return true;
}
  • 出棧
bool Pop(SqStack &S,ElemType &x)
{
	if(S.top==-1)
		return false;
	x=S.data[S.top--];//先出棧,指針再減一
	return true;
}
  • 讀棧頂元素
bool GetTop(SqStack S,ElemType &x)
{
	if(S.top==-1)
		return false;
	x=S.data[S.top];//x記錄棧頂元素
	return true;
}

共享棧,利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數據空間,將兩個棧的棧底分別設置在共享空間的兩端,兩個棧頂向共享空間的中間延伸在這裏插入圖片描述
兩個棧的棧頂指針都指向棧頂元素,top1=-1時1號棧爲空,top1=MaxSize時2號棧爲空,僅當兩個棧頂指針相鄰時(top2-top1=1)時,判斷爲棧滿。當1號棧進棧時top1先加1再賦值,2號棧進棧時top2先減1再賦值,出棧時正好相反

棧的鏈式存儲結構(鏈棧),優點是便於多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況,通常使用單鏈表實現,並且規定所有操作都是在單鏈表的表頭進行的
在這裏插入圖片描述
棧的鏈式存儲類型描述:

typedef struct Linknode
{
	ElemType data;//數據域
	struct Linknode *next;//指針域
}*LiStack;//棧類型定義
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章