第三章:棧和隊列
1.棧的基本概念
棧(Stack) 只允許在 一端 (這一端叫做棧頂) 進行插入或者刪除操作的 線性表
在棧中先進入棧的元素會後出棧即:先進後出
(LIFO)
2.棧的基本操作
InitStack(&s)
初始化一個空棧S
StackEmpty(S)
判斷一個棧是否爲空,若棧爲空則返回true,否則返回 false
Push(&S,x)
進棧,若棧S未滿,則將加入使之成爲新棧頂。
Pop(&S,&x)
出棧,若棧非空,則彈出棧頂元素,並用x返回。
GetTop(S,&x)
讀棧頂元素,若棧非空則用x返回棧頂元素。
ClearStack(&S)
銷燬棧,並釋放S佔用的內存空間。
這裏發現:Pop
和 GetTop
這兩個函數都可以返回棧頂元素,不同的是Pop
會移除棧頂元素,而 GetTop
只會獲取棧頂元素的值,而不會出棧。
3.棧的順序存儲結構
順序棧:採用順序存儲的棧
#define MaxSize 50
typedef struct{
ElemType date[MaxSize];
int top; //數組的下標
}SqStack;
3.1判斷棧空&滿&長度
棧空條件:S.top==-1
,在棧裏面沒有內容的時候top代表數組的下標此時值爲-1;
棧的長度:S.top+1
,top代表數據下標,所以棧的長度等於數組下標+1;
棧滿條件:S.top==MaxSize-1
,如果棧的top下標爲數組長度-1說明棧滿了。
3.2 棧的基本操作
3.2.1初始化
void InitStack(SqStack &S){
S.top == -1;
}
3.2.2判斷棧空
boll StackEmpty(SqStack &S){
if(S.top == -1){
return true;
}else{
return false;
}
}
3.2.3進棧
boll Push(SqStack &S,ElemType x){
if(S.top == MaxSize-1){ //棧滿
return fase;
}
S.data[++S.top] = x;
return true;
}
3.2.4出棧
boll Pop(SqStack &S,ElemType &x){
if(S.top == -1){ //棧空
return fase;
}
x = S.data[S.top--];
return true;
}
3.2.5獲取棧頂元素
boll GetTop(SqStack S,ElemType &x){
if(S.top == -1){ //棧空
return fase;
}
x = S.data[S.top] //只需讀取,不需移動下標
return true;
}
3.3.共享棧
共享棧:將兩個棧底設置在共享空間的兩端,棧頂向空間中間延伸;
判空:
- 0號棧 top==-1
- 1號棧 top==MaxSize
判滿: tpp1-top0==1
共享棧的優點:存取時間複雜度仍爲O(1),且空間利用更加有效。
4.棧的鏈式存儲結構
鏈棧 採用鏈式存儲的棧
這裏不需要頭節點,這裏規定了第一個結點爲棧頂結點所以:所有的操作都要在表頭進行
。
4.1鏈棧基本操作
因爲相當於是單鏈表,所以鏈棧的判空,出棧,棧的長度和單鏈表的操作基本相同。