棧是一種只允許在一端進行插入和刪除操作的線性表,棧頂是允許插入和刪除的那一端,而棧底是不允許插入和刪除的那一端
基本操作:
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;//棧類型定義