1. 程式人生 > 其它 >「CF678E」題解

「CF678E」題解

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

型別定義:

// 棧的結點型別
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;
    }
}