標籤:img include empty 語言 成功 指標 http void 定義資料
#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");}// 定義入棧函數// 從棧頂插入數值valvoid 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);}// 定義出棧函數// 從棧頂彈出,並將地址賦值給變數valvoid 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");}
運行結果
棧的實現及操作(C語言描述)