「CF678E」題解
阿新 • • 發佈:2021-09-30
鏈棧的表示:鏈棧是運算受限的單鏈表,只能在連結串列頭部進行操作。(用鏈式儲存,儲存的棧)
型別定義:
// 棧的結點型別 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; } }