鏈棧的表示:鏈棧是運算受限的單鏈表,只能在鏈表頭部進行操作。(用鏈式存儲,存儲的棧)
類型定義:
// 棧的結點類型 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; } }