1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 typedef int ElemType;
6 #define OK 1
7 #define ERROR 0
8 typedef int Status;
9 #define MAXSIZE 100
10
11 typedef struct StackNode
12 {
13 ElemType data;
14 struct StackNode *next;
15 }StackNode, *LinkStackPtr;
16 typedef struct LinkStack
17 {
18 LinkStackPtr top;
19 int count;
20 }LinkStack;
21
22 Status InitStack(LinkStack *S)
23 {
24 S->top = NULL;
25 S->count = 0;
26 return OK;
27 }
28 Status DestroyStack(LinkStack *S)
29 {
30 LinkStackPtr p;
31 while (S->top)
32 {
33 p = S->top;
34 S->top = S->top->next;
35 free(p);
36 }
37 S->count = 0;
38 return OK;
39 }
40 Status StackEmpty(LinkStack S)
41 {
42 if (S.count==0)
43 return OK;
44 return ERROR;
45 }
46 Status GetTop(LinkStack S, ElemType *e)
47 {
48 if (S.top ==NULL)
49 return ERROR;
50 *e = S.top->data;
51 return OK;
52 }
53 Status Push(LinkStack *S, ElemType e)
54 {
55 LinkStackPtr p = (LinkStackPtr)malloc(sizeof(LinkStack));
56 p->data = e;
57 p->next = S->top;
58 S->top = p;
59 S->count++;
60 return OK;
61 }
62 Status Pop(LinkStack *S, ElemType *e)
63 {
64 if (S->top==NULL)
65 return ERROR;
66 *e = S->top->data;
67 LinkStackPtr p;
68 p = S->top;
69 S->top = S->top->next;
70 free(p);
71 S->count--;
72 return OK;
73 }
74 int StackLength(LinkStack S)
75 {
76 return S.count;
77 }
78 void visit(ElemType n)
79 {
80 printf("%d ", n);
81 }
82
83 void ListTraverse(LinkStack S)
84 {
85 int i;
86 while(S.top)
87 {
88 visit(S.top->data);
89 S.top = S.top->next;
90 }
91 }
92 int main()
93 {
94 LinkStack L;
95 Status i, j;
96 char opp = '-1';
97 ElemType e;
98 int pos = 1;
99 int k = 0;
100
101 i = InitStack(&L);
102 printf("栈L初始化完毕,StackLength(L)=%d\n\n", StackLength(L));
103
104 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n4.获取栈顶数据\n5.栈是否为空 \n6.销毁栈 \n0.退出 \n请选择你的操作:\n");
105
106 while (opp != '0') {
107 scanf_s("%c", &opp);
108 switch (opp) {
109 case '1':
110 ListTraverse(L);
111 printf("\n");
112 break;
113
114 case '2':
115 srand((unsigned)time(NULL));
116 for (j = 1; j <= 10; j++)
117 {
118 i = Push(&L, rand() % 100);
119 }
120 printf("在栈中依次插入10个随机数后:");
121 ListTraverse(L);
122 printf("\n");
123 printf("创建完毕,StackLength(L)=%d\n\n", StackLength(L));
124 break;
125 case '3':
126 e = -1;
127 Pop(&L, &e);
128 printf("弹出栈顶元素%d,现在链表为:\n", e);
129 ListTraverse(L);
130 printf("\n");
131 break;
132 case '4':
133 GetTop(L, &e);
134 printf("栈顶元素的值为:%d\n", e);
135 printf("\n");
136 break;
137 case '5':
138 i = StackEmpty(L);
139 printf("栈是否为空?:%d\n", i);
140 printf("\n");
141 break;
142
143 case '6':
144 i = DestroyStack(&L);
145 printf("\n销毁栈:ListLength(L)=%d\n", StackLength(L));
146 ListTraverse(L);
147 printf("\n");
148 break;
149
150 case '0':
151 exit(0);
152 }
153 }
154 }