四 棧的鏈式存儲
簡單鏈式棧
1 ////////////鏈表結點結構體///////////// 2 typedef struct Node 3 { 4 int data; 5 Node* next; 6 }Node; 7 8 //創建結點 9 Node* createNode(int data) 10 { 11 Node* newNode = (Node*)malloc(sizeof(Node)); 12 newNode->data = data; 13 newNode->next = NULL; 14 return newNode; 15 } 16 17 /////////棧結構體//////////////// 18 typedef struct Stack 19 { 20 Node* stackTop; //用棧頂指針表示整個鏈表 21 int size; 22 }stack; 23 24 //創建棧 25 stack* createStack() 26 { 27 stack* mystack = (stack*)malloc(sizeof(stack)); 28 mystack->stackTop = NULL; 29 mystack->size = 0; 30 return mystack; 31 } 32 //入棧 33 void push(stack* mystack, int data) 34 { 35 //入棧--->鏈表的表頭插入 36 Node* newNode = createNode(data); 37 newNode->next = mystack->stackTop; 38 mystack->stackTop = newNode; //棧頂指針移動 39 mystack->size++; 40 } 41 //獲取棧頂元素 42 int top(stack* mystack) 43 { 44 if (mystack->size == 0) 45 { 46 printf("棧為空,無法獲取"); 47 system("pause"); 48 return mystack->size; 49 } 50 return mystack->stackTop->data; 51 } 52 //出棧 53 void pop(stack* mystack) 54 { 55 if (mystack->size == 0) 56 { 57 printf("棧為空,無法獲取"); 58 system("pause"); 59 } 60 else 61 { 62 //緩存 63 Node* nextNode = mystack->stackTop->next; 64 //刪除 65 free(mystack->stackTop); 66 mystack->stackTop = nextNode;//棧頂指針移動 67 mystack->size--; 68 } 69 } 70 //判斷棧是否為空 71 int empty(stack* mystack) 72 { 73 if (mystack->size == 0) 74 return 0; 75 return 1; //返回1 表示棧不為NULL 76 77 } 78 int main() 79 { 80 stack* mystack = createStack(); 81 push(mystack, 1); 82 push(mystack, 2); 83 push(mystack, 3); 84 while (empty(mystack)) 85 { 86 printf("%d-->", top(mystack)); 87 pop(mystack); 88 } 89 90 system("pause"); 91 return 0; 92 }
企業鏈式棧
linkStack.h
1 #pragma once 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 //鏈表小結點 6 typedef struct StackNode 7 { 8 struct StackNode* next; 9 }StackNode; 10 11 //鏈棧結構體 12 typedef struct LinkStack 13 { 14 StackNode header; 15 int size; 16 }LinkStack; 17 18 //初始化 19 LinkStack* Init_Stack(); 20 21 //壓棧 22 void Push_Stack(LinkStack* LStack, StackNode* data); 23 24 //彈棧 25 void* Pop_Stack(LinkStack* LStack); 26 27 //獲取棧頂 28 void* Top_Stack(LinkStack* LStack); 29 30 //是否為空棧 31 int IsEmpty_Stack(LinkStack* LStack); 32 33 //返回棧的大小 34 int Size_Stack(LinkStack* LStack); 35 36 //銷毀棧 37 void Desory_Stack(LinkStack* LStack);
linkStack.c
1 #include "linkStack.h" 2 3 //初始化 4 LinkStack* Init_Stack() 5 { 6 LinkStack* LS = (LinkStack*)malloc(sizeof(LinkStack)); 7 LS->header.next = NULL; 8 LS->size = 0; 9 return LS; 10 } 11 12 //壓棧 13 void Push_Stack(LinkStack* LStack, StackNode* data) 14 { 15 if (LStack == NULL || data == NULL) 16 { 17 return; 18 } 19 data->next = LStack->header.next; 20 LStack->header.next=data; 21 LStack->size++; 22 } 23 24 //彈棧 25 void* Pop_Stack(LinkStack* LStack) 26 { 27 if (LStack == NULL||LStack->size==0) 28 return NULL; 29 StackNode* node = LStack->header.next; 30 LStack->header.next = node->next; 31 LStack->size--; 32 return node; 33 34 } 35 36 //獲取棧頂 37 void* Top_Stack(LinkStack* LStack) 38 { 39 if (LStack == NULL || LStack->size == 0) 40 return NULL; 41 StackNode* node = LStack->header.next; 42 return node; 43 } 44 45 //返回棧的大小 46 int Size_Stack(LinkStack* LStack) 47 { 48 if (LStack == NULL) 49 return -1; 50 return LStack->size; 51 } 52 53 54 //是否為空棧 0 非空 1 空 55 int IsEmpty_Stack(LinkStack* LStack) 56 { 57 if (LStack == NULL || LStack->size == 0) 58 return 1; 59 return 0; 60 } 61 62 //銷毀棧 63 void Desory_Stack(LinkStack* LStack) 64 { 65 if (LStack == NULL) 66 return; 67 free(LStack); 68 LStack = NULL; 69 }
main.c
1 #include "linkStack.h" 2 3 //數據 4 typedef struct Person 5 { 6 StackNode node; 7 char name[64]; 8 int age; 9 }Person; 10 11 int main() 12 { 13 Person p1 = { "NULL","張飛",21 }; 14 Person p2 = { "NULL","李逵",19 }; 15 Person p3 = { "NULL","何進",23 }; 16 Person p4 = { "NULL","武松",24 }; 17 Person p5 = { "NULL","袁曉",20 }; 18 //創建棧 19 LinkStack* stack = Init_Stack(); 20 //插入數據 21 Push_Stack(stack, &p1); 22 Push_Stack(stack, &p2); 23 Push_Stack(stack, &p3); 24 Push_Stack(stack, &p4); 25 Push_Stack(stack, &p5); 26 printf("棧頂元素:name=%s age=%d\n", ((Person*)Top_Stack(stack))->name, ((Person*)Top_Stack(stack))->age); 27 while (!IsEmpty_Stack(stack)) 28 { 29 Person* p = Pop_Stack(stack); 30 printf("name=%s age=%d\n", p->name, p->age); 31 } 32 33 Desory_Stack(stack); 34 system("pause"); 35 return 0; 36 }

浙公網安備 33010602011771號