棧的應用和實現

HerryLo發表於2020-03-16

本文原文連結

棧是線性結構的常見應用,是一種可以實現"先進後出"的儲存結構,?:讓我們想一下箱子?,往?裡面放東西,最先放入?中的東西被放在底部,後放入的反而在上面,假設我們從上至下的拿東西,那麼就是先放入的後出,後放入的先出,即這就是一個"先入後出"的儲存結構。

棧的應用非常的廣泛:函式呼叫、中斷、表示式求值、記憶體分配、快取、迷宮都有應用棧的知識。

棧和佇列實現雖然不同,但都可以通過陣列和連結串列實現,棧分為靜態棧和動態棧,靜態棧有陣列構成,動態棧有連結串列構成。

其中的核心操作就是:壓棧和出棧。壓棧就是放入棧中,出棧就是拿出棧中。下面我們看看棧的基本結構:

  棧頂Top                       棧底Bottom
    ?                             ?
[data|next]——>[data|next]——>[data=NULL|next]——> NULL
複製程式碼

確認一個棧只需要兩個引數,棧頂Top和棧底Bottom,初始建立時,棧頂Top等於棧底Bottom;壓棧時,棧頂Top移動;出棧時,還是棧頂Top移動。

#C語言棧實現

首先我們先來做好初始化的準備:

// 連結串列元素結構體
typedef struct Node {
    int data;
    struct Node * next;
}Node, *pNode;

// 棧的引數
typedef struct Stack {
    pNode pTop;         // 棧頂
    pNode pBottom;      // 棧底
}Stack, *pStack;

// 初始化
void initStack(pStack s);
// 壓棧
void pushStack(pStack s, int value);
// 遍歷
void traverseStack(pStack s);
// 出棧
bool popStack(pStack s);
複製程式碼

以上就是棧的基本操作,下面是函式的實現

// 初始化
void initStack(pStack s) {
    s->pTop = (pNode)malloc(sizeof(Node));
    if(s->pTop == NULL) {
        printf("記憶體分配失敗");
        exit(-1);
    }
    s->pBottom = s->pTop;
    s->pTop->next = NULL;
}
// 壓棧
void pushStack(pStack s, int value){
    pNode pNew = (pNode)malloc(sizeof(Node));
    if(pNew == NULL) {
        printf("記憶體分配失敗");
        exit(-1);
    }
    s->pTop = pNew;
    pNew->data = value;
    pNew->next = s->pBottom;
}
// 遍歷
void traverseStack(pStack s){
    pNode top = s->pTop;
    while(top->next != NULL){
        peintf("%d\n", top->data);
        top = top->next;
    }
}
// 出棧
bool popStack(pStack s){
    pNode node = s->pTop;
    if(node->next != NULL){
        return false;s
    }
    s->pTop = s->pTop->next;
    free(node);
    retrun false;
}
複製程式碼

main函式中建立呼叫棧:

int main() {
    // 建立棧
    Stack s;
    
    initStack(&s);
    pushStack(&s, 1);
    pushStack(&s, 2);
    pushStack(&s, 3);
    pushStack(&s, 4);
    traverseStack(&s);
    popStack(&s);
    traverseStack(&s);
    
    return 0;
}
複製程式碼

程式碼示例:C語言建立棧

參考:

郝斌老師資料結構視訊

ps: 微信公眾號:Yopai,有興趣的可以關注,每週不定期更新。不斷分享,不斷進步


相關文章