#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; // 定義數據類型 // 定義節點 typedef struct Node { Elementtype Element; struct Node * Next; }NODE, *PNODE; // 定義棧結構體 typedef struct Stack { PNODE PTOP; // 定義棧頂節點 PNODE PBOTTOM; // 定義棧底節點 }STACK,* PSTACK; // 函數聲明 void InitStack(PSTACK Stack); // 初始化棧 void PushStack(PSTACK Stack, int val); // 入棧函數 void PopStack(PSTACK Stack,int *val); // 出棧函數 void TraverseStack(PSTACK Stack); // 遍歷棧函數 bool IsEmpty(PSTACK Stack); // 判斷棧是否為空函數 void ClearStack(PSTACK Stack); // 清空棧函數 // 主函數 int main() { STACK Stack; // 創建一個棧變量 int val = 0; // 定義一個變量 InitStack(&Stack); // 調用初始化棧函數 IsEmpty(&Stack); // 調用判斷棧是否為空函數 PushStack(&Stack, 100); // 調用入棧函數,把100推入棧中 PushStack(&Stack, 200); PushStack(&Stack, 300); PushStack(&Stack, 400); PushStack(&Stack, 500); PushStack(&Stack, 600); IsEmpty(&Stack); TraverseStack(&Stack); // 調用棧遍歷函數 PopStack(&Stack, &val); // 調用出棧函數 TraverseStack(&Stack); ClearStack(&Stack); // 調用清空棧函數 IsEmpty(&Stack); return 0; } // 定義初始化棧函數 void InitStack(PSTACK Stack) { PNODE PNew = (PNODE)malloc(sizeof(NODE)); // 新建一個節點 if (PNew == NULL) { // 判斷內存是否分配成功 printf("新節點空間分配失敗!\n"); exit(-1); } Stack->PTOP = PNew; // 棧頂指針指向新節點 Stack->PBOTTOM = PNew; // 棧底指針指向新節點 PNew->Next = NULL; // 新節點指針指向為空 printf("棧創建成功!\n"); } // 定義入棧函數 // 從棧頂插入數值val void PushStack(PSTACK Stack,int val) { PNODE P = (PNODE)malloc(sizeof(NODE)); // 創建新的節點用於存放變量 if (P == NULL) { printf("分配空間內存失敗!"); exit(-1); } P->Element = val; // 變量賦值給節點的數據域 P->Next=Stack->PTOP; // 讓新建的節點指向上一個節點 Stack->PTOP = P; // 更新頂部節點,使其指向新建的節點 printf("%d 入棧成功!\n",val); } // 定義出棧函數 // 從棧頂彈出,並將地址賦值給變量val void PopStack(PSTACK Stack, int *val) { if (Stack->PBOTTOM == Stack->PTOP) { // 判斷棧是否為空 printf("出棧失敗,棧為空!\n"); } PNODE P = Stack->PTOP; // 建立一個臨時節點指向棧頂節點 *val = P->Element; // 把棧頂節點元素彈出,地址放到變量val中 Stack->PTOP = P->Next; // 把棧頂指針指向上一個棧節點 free(P); // 釋放節點內存,防止內存空間泄漏 P = NULL; // 防止產生野指針 printf("已將%d從棧彈出!\n", *val); } // 定義判斷棧是否為空函數 bool IsEmpty(PSTACK Stack) { if (Stack->PBOTTOM == Stack->PTOP) { printf("棧為空!\n"); return true; } else { return false; } } // 定義棧的遍歷函數 void TraverseStack(PSTACK Stack) { if (IsEmpty(Stack)) { // 判斷棧是否為空 printf("遍歷棧失敗,棧為空!"); exit(-1); } PNODE P = Stack->PTOP; // 建立一個臨時節點指針,初始化時指向棧頂 //使臨時節點指針從棧頂開始遍歷棧,直到棧底 printf("遍歷棧的結果為: "); while (P != Stack->PBOTTOM) { printf("%d ", P->Element); // 打印出數據 P = P->Next; } printf("\n"); } // 定義棧的清空函數 void ClearStack(PSTACK Stack) { if (IsEmpty(Stack)) { // 判斷棧是否為空 printf("棧已經為空,無需清空!\n"); exit(-1); } // 創建兩個節點指針用來釋放棧 PNODE P = Stack->PTOP; PNODE Q = NULL; // 清空棧 while (P != Stack->PBOTTOM) { Q = P->Next; free(P); P = Q; } Stack->PTOP = Stack->PBOTTOM; // 棧頂指向棧底指向的初始空節點 printf("已清空棧!\n"); }
運行結果