堆栈的链式存储实现
链式栈头文件:
1 #pragma once 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 //链式栈的结点 6 typedef struct LINKNODE 7 { 8 LINKNODE* next; 9 }LinkNode; 10 11 //链式栈 12 typedef struct LINKSTACK 13 { 14 LinkNode head; 15 int size; 16 }LinkStack; 17 18 //初始化链表 19 LinkStack* Init_LinkStack(); 20 //入栈 21 void Push_LinkStack(LinkStack* lstack, LinkNode* value); 22 //出栈 23 void Pop_LinkStack(LinkStack* lstack); 24 //返回栈顶元素 25 LinkNode* Top_LinkStack(LinkStack* lstack); 26 //返回栈元素个数 27 int Size_LinkStack(LinkStack* lstack); 28 //清空栈 29 void Clear_LinkStack(LinkStack* lstack); 30 //销毁栈 31 void Free_LinkStack(LinkStack* lstack);
链式栈实现文件:
1 #include "栈的链式存储.h" 2 //初始化链表 3 LinkStack* Init_LinkStack() 4 { 5 LinkStack* lstack = (LinkStack*)malloc(sizeof(LinkStack)); 6 if (lstack == NULL) 7 { 8 exit(1); 9 } 10 11 lstack->head.next = NULL; 12 lstack->size = 0; 13 14 return lstack; 15 } 16 //从头节点入栈 17 void Push_LinkStack(LinkStack* lstack, LinkNode* value) 18 { 19 if (lstack == NULL) 20 { 21 exit(1); 22 } 23 24 if (value == NULL) 25 { 26 exit(1); 27 } 28 29 value->next = lstack->head.next; 30 lstack->head.next = value; 31 lstack->size++; 32 } 33 //出栈 34 void Pop_LinkStack(LinkStack* lstack) 35 { 36 if (lstack == NULL) 37 { 38 exit(1); 39 } 40 41 if (lstack->size == 0) 42 { 43 exit(1); 44 } 45 46 // 47 LinkNode* pCurrent = lstack->head.next; 48 lstack->head.next = pCurrent->next; 49 lstack->size--; 50 } 51 //返回栈顶元素 52 LinkNode* Top_LinkStack(LinkStack* lstack) 53 { 54 if (lstack == NULL) 55 { 56 exit(1); 57 } 58 59 if (lstack->size == 0) 60 { 61 exit(1); 62 } 63 64 return lstack->head.next; 65 } 66 //返回栈元素个数 67 int Size_LinkStack(LinkStack* lstack) 68 { 69 if (lstack == NULL) 70 { 71 exit(1); 72 } 73 74 return lstack->size; 75 } 76 //清空栈 77 void Clear_LinkStack(LinkStack* lstack) 78 { 79 if (lstack == NULL) 80 { 81 exit(1); 82 } 83 84 lstack->head.next = NULL; 85 lstack->size = 0; 86 } 87 //销毁栈 88 void Free_LinkStack(LinkStack* lstack) 89 { 90 if (lstack == NULL) 91 { 92 exit(1); 93 } 94 95 free(lstack); 96 }
链式栈测试:
1 #include"栈的链式存储.h" 2 #include<string.h> 3 #include<stdlib.h> 4 #include<stdio.h> 5 6 #define M 8 7 #define N 3 8 //数据元素结构体 9 typedef struct PERSON 10 { 11 LinkNode node; 12 char name[64]; 13 int age; 14 }Person; 15 16 int main(int argc, const char* argv[]) 17 { 18 //创建循环链表 19 LinkStack* lstack = Init_LinkStack(); 20 21 //创建数据 22 Person p1, p2, p3, p4, p5; 23 strcpy_s(p1.name, "aaa"); 24 strcpy_s(p2.name, "bbb"); 25 strcpy_s(p3.name, "ccc"); 26 strcpy_s(p4.name, "ddd"); 27 strcpy_s(p5.name, "eee"); 28 29 p1.age = 20; 30 p2.age = 30; 31 p3.age = 40; 32 p4.age = 50; 33 p5.age = 60; 34 35 //入栈 36 Push_LinkStack(lstack, (LinkNode*)&p1); 37 Push_LinkStack(lstack, (LinkNode*)&p2); 38 Push_LinkStack(lstack, (LinkNode*)&p3); 39 Push_LinkStack(lstack, (LinkNode*)&p4); 40 Push_LinkStack(lstack, (LinkNode*)&p5); 41 42 //出栈 43 Person* tmp = (Person*)Top_LinkStack(lstack); 44 printf("name %s age %d\n", tmp->name, tmp->age); 45 46 //删除 47 Pop_LinkStack(lstack); 48 49 //出栈 50 tmp = (Person*)Top_LinkStack(lstack); 51 printf("name %s age %d\n", tmp->name, tmp->age); 52 53 //判断是否为空 54 int ret = Size_LinkStack(lstack); 55 printf("判断是否为空:%d\n", ret); 56 //清空栈 57 Clear_LinkStack(lstack); 58 59 //释放 60 Free_LinkStack(lstack); 61 system("pause"); 62 return 0; 63 }