學習數據結構--第三章:棧和隊列(棧的基本操作)

第三章:棧和隊列

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佔用的內存空間。

這裏發現:PopGetTop 這兩個函數都可以返回棧頂元素,不同的是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鏈棧基本操作

因爲相當於是單鏈表,所以鏈棧的判空,出棧,棧的長度和單鏈表的操作基本相同。

歡迎關注公衆號 理木客 更多精彩等你發現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章