堆栈的链式存储实现

 

 链式栈头文件:

 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
", tmp->name, tmp->age);
45 
46     //删除
47     Pop_LinkStack(lstack);
48 
49     //出栈
50     tmp = (Person*)Top_LinkStack(lstack);
51     printf("name %s age %d
", tmp->name, tmp->age);
52 
53     //判断是否为空
54     int ret = Size_LinkStack(lstack);
55     printf("判断是否为空:%d
", ret);
56     //清空栈
57     Clear_LinkStack(lstack);
58     
59     //释放
60     Free_LinkStack(lstack);
61     system("pause");
62     return 0;
63 }
原文地址:https://www.cnblogs.com/dhhu007/p/13197918.html