构没有满这一说,但是理论上是这样的,也要结合具体的内存,操作系统等环境因素。
复制代码
1 #ifndef _____ADT__
2 #define _____ADT__
3 #include
4 #include
5 #include
6
7 typedef struct Node{
8 char data;
9 struct Node *next; //next 指针
10 } Node, *ListStack;
11
12 //初始化头结点,top 指针指向头结点
13 void initStack(ListStack *top)
14 {
15 //top就是头指针!也就是栈顶指针
16 *top = (ListStack)malloc(sizeof(Node));
17 //就一个结点,也就是空栈,其实和链表一样,没啥意思
18 (*top)->next = NULL;
19 //内容初始化
20 (*top)->data = '0';
21 }
22
23 //判空
24 bool isEmpty(ListStack top)
25 {
26 //栈顶指针的next==NULL 就是空栈,没有满的判断,但是也要悠着点。小心内存受不了。
27 return top->next == NULL true : false;
28 }
29
30 //入栈
31 void push(ListStack top, char topElement)
32 {
33 ListStack q = NULL;
34 q = (ListStack)malloc(sizeof(Node));
35
36 if (NULL == q) {
37 exit(0);
38 }
39 //类似头插法建表,进栈
40 q->next = top->next;
41 top->next = q;
42 //赋值
43 top->data = topElement;
44 //栈底永远是表尾指针
45 }
46
47 //出栈
48 void pop(ListStack top, char *topElement)
49 {
50 ListStack p = NULL;
51
52 if (isEmpty(top)) {
53 exit(0);
54 }
55 //栈顶元素出栈,记住,栈顶指针永远是指向栈顶元素的下一位,p 指向栈顶元素
56 p = top->next;
57 *topElement = p->data;
58 //删除这个元素
59 top->next = p->next;
60 free(p);
61 }
62
63 //求当前长度
64 int getLength(ListStack top)
65 {
66 int i = 0;
67 ListStack q = top->next;
68
69 while (q != NULL) {
70 i++;
71 q = q->next;
72 }
73
74 return i;
75 }
76
77 //求栈顶元素
78 char getTop(ListStack top, char topElement)
79 {
80 if (isEmpty(top)) {
81 puts("栈空!");
82 }
83
84 topElement = top->next->data;
85 return topElement;
86 }
87
88 //遍历
89 void traversal(ListStack top)
90 {
91 ListStack p = top->next;
92
93 for (int i = 0; i < getLength(top); i++) {
94 printf("栈中元素遍历:%c \n", p->data);
95 p = p->next;
96 }
97 }
98
99 //销毁
100 void destroyLinkStack(ListStack *top)
101 {
102 ListStack p = *top;
103 ListStack pn = (*top)->next;
104
105 while (pn != NULL)
106 {
107 free(p);
108 p = pn;
109 pn = pn->next;
110 }
111 //销毁最后一个
112 free(p);
113 p = NULL;
114 puts("栈成功销毁!");
115 }
116
117 #endif /* defined(_____ADT__) */
复制代码
main 函数
复制代码
1 #include "ADT.h"
2
3 int main(void) {
4 ListStack stack = NULL;
5 initStack(&stack);
6
7 printf("栈长度 = %d\n", getLength(stack));
8
9 push(stack, 'a');
10 push(stack, 'b');
11 push(stack, 'c');
12 push(stack, 'd');
13
14 printf("栈长度 = %d\n", getLength(stack));
15
16 traversal(stack);
17
18 char temp = '0';
19 printf("栈顶元素 = %c\n", getTop(stack, temp));
20 pop(stack, &temp);
21
22 printf("栈长度 = %d\n",getLength(stack));
23
24 traversal(stack);
25
26 destroyLinkStack(&stack);
27
28 return 0;
29 }
复制代码
其实链栈和链表是一样的,没什么新鲜的东西。可见,线性表,尤其是链表,是数据结构和算法里的重中之重,后续很多复杂高级的数据结构和算法,都会无数次的用到链表的相关知识和概念。