C語言實現鏈棧的步驟
鏈棧圖解
鏈棧的常規操作
/********************* 鏈棧的常規操作 ****************************/ LinkStack InitLinkStack(); // 初始化鏈棧 int StackEmpty(); // 判斷鏈棧空 int StackLength(); // 求鏈棧長(鏈棧元素個數) int Push(); // 入棧 壓棧 ElemType Pop(); // 出棧 彈棧 void DestroyStack(); // 銷毀鏈棧 /***************************************************************/
定義鏈棧結構體
#include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 typedef int ElemType; // 鏈棧存儲元素的數據類型 /* * 定義鏈棧結構體 */ typedef struct Node{ ElemType data; // 棧結點數據域 struct Node *next; // 棧結點指針域 }*LinkStack, Node;
初始化鏈棧
// 初始化鏈棧(帶頭結點的鏈棧) LinkStack InitLinkStack(){ LinkStack s = (LinkStack)malloc(sizeof(struct Node)); s -> next = NULL; return s; }
鏈棧判空
/* * 判斷鏈棧是否空 * s 鏈棧 */ int StackEmpty(LinkStack s){ if(s == NULL){ return FALSE; } return s -> next == NULL; }
因為是鏈式存儲結構,無需鏈棧判滿。
計算鏈棧的長度
/* * 求鏈棧長度(棧中元素個數) * s 鏈棧 */ int StackLength(LinkStack s){ LinkStack p; int len = 0; if(StackEmpty(s)){ return FALSE; } p = s -> next; // 帶頭結點的鏈棧要先移動一下 while(p != NULL){ len ++; p = p -> next; } return len; }
鏈棧入棧(Push)
/* * 入棧 壓棧 * s 鏈棧 * data 入棧數據 */ int Push(LinkStack s, ElemType data){ // 分配入棧結點 Node *new_node = (Node *)malloc(sizeof(struct Node)); if (new_node == NULL) return FALSE; // 結點分配失敗 // 跟單鏈表一樣使用頭插法 new_node -> data = data; new_node -> next = s -> next; s -> next = new_node; return TRUE; }
鏈棧出棧(Pop)
/* * 出棧 彈棧 * s 鏈棧 */ ElemType Pop(LinkStack s){ LinkStack top; ElemType data; // 判棧空 if(StackEmpty(s)){ return FALSE; } top = s -> next; // 訪問棧頂結點 data = top -> data; // 取出棧頂元素 s -> next = top -> next; free(top); // 釋放棧頂空間 return data; }
鏈棧各操作測試
// 程序主入口 int main(int argc, char const *argv[]) { LinkStack s = InitLinkStack(); printf("StackEmpty():%d\n", StackEmpty(s)); printf("StackLength():%d\n\n", StackLength(s)); // 入棧元素 ElemType datas[] = {1, 3, 5, 7, 9}; // 動態計算入棧元素個數 int len = sizeof(datas) / sizeof(datas[0]); // for循環依次入棧 printf("Push():"); for(int i = 0; i < len; i++){ printf("%d\t", datas[i]); Push(s, datas[i]); } printf("\nStackEmpty():%d\n", StackEmpty(s)); printf("StackLength():%d\n\n", StackLength(s)); // 出棧 彈棧 printf("Pop(): "); while(!StackEmpty(s)){ printf("%d\t", Pop(s)); } printf("\nStackEmpty():%d\n", StackEmpty(s)); printf("StackLength():%d\n\n", StackLength(s)); return 0; }
結果如下:
StackEmpty():1 StackLength():0 Push():1 3 5 7 9 StackEmpty():0 StackLength():5 Pop(): 9 7 5 3 1 StackEmpty():1 StackLength():0
源代碼
源代碼已上傳到 GitHub Data-Structure-of-C,歡迎大傢來訪。
以上就是C語言實現鏈棧的步驟的詳細內容,更多關於C語言實現鏈棧的資料請關註WalkonNet其它相關文章!