鏈棧的表示和實現


鏈棧的表示:鏈棧是運算受限的單鏈表,只能在鏈表頭部進行操作。(用鏈式存儲,存儲的棧)

類型定義:

// 棧的結點類型
typedef struct StackNode{
    // 數據域,用來存放棧中元素
    // 所以它的類型是棧里元素的類型
    SElemType data;
    // 指針域是指向下一個元素的
    // 所以它指向的類型仍然是這種(StackNode)結構類型
    // 所以這樣定義這個指針,即規定它要指向什么樣的結構類型才合法
    struct StackNode *next;
    // 再用這樣一個類型定義一個指向這樣結點的指針類型,
    // 也就是*LinkStack
} StackNode, *LinkStack;

// 用大寫字母 S 來表示Stack 棧
LinkStack S;

 

 

棧的存儲:(第一個元素就是棧底,最后一個元素就是棧頂,S指向棧頂)

注意!!!鏈棧中指針的方向和單鏈表的指針方向是不同的,

單鏈表是第一個元素指向第二個元素,第二個指向第三個

鏈棧里的指向是反過來的,由最后一個指向倒數第二個,以此類推

 

① 鏈棧的頭指針就是棧頂

② 不需要頭結點

③ 基本不存在棧滿的情況(只要內存有空間,不會棧滿)

④ 空棧相當於頭指針指向空

⑤ 插入和刪除僅在棧頂處執行

 

鏈棧的初始化

void InitStack(LinkStack &S){
    // 構造一個空棧,棧頂指針置為空
    // S 是頭指針
    S = NULL;
    return OK;
}

 

 

【補充算法】判斷鏈棧是否為空

就是判斷頭指針是否為空,如果為空就返回TRUE,否則返回FALSE

Status StackEmpty(LinkStack S){
    if(S == NULL){
        return TRUE;
    }else{
        return FALSE;
    }
}

 

 

鏈棧的入棧

S指向棧頂元素,S為頭指針

① P->next = S // 讓P所指向的元素指向S所指向的元素

② S = P // 修改頭指針指向位置

Status Push(LinkStack &S, SElemType e){
    p = new StackNode; // 生成新節點P
    p -> data = e; // 將新節點數據域設置為 e
    p -> next = S; // 將新節點插入棧頂
    S = p; // 修改棧頂指針
    return OK;
}

 

 

鏈棧的出棧

① 讓一個指針 P 指向 S 所指向結點

② 讓指針 S 指向下一個結點

③ 銷毀 指針P 所指向結點

Status Pop(LinkStack &S, SElemType &e){
    if(S == NULL){
        return ERROR;
    }
    e = S -> data;
    p = S;
    S = S -> next;
    delete p;
    return OK;
}

 

 

取棧頂元素

 

 

SElemType GetTop(LinkStack S){
    if(S!=NULL){
        return S->data;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM