头文件
1 typedef int ElementType;
2
3 #ifndef _STACKLI_H_
4 #define _STACKLI_H_
5
6 struct Node;
7 typedef Node *PtrToNode;
8 typedef PtrToNode Stack;
9
10 int IsEmpty(Stack S);
11 Stack CreateStack(void);
12 void DisposeStack(Stack S);
13 void MakeEmpty(Stack S);
14 void Push(ElementType X, Stack S);
15 ElementType Top(Stack S);
16 void Pop(Stack S);
17
18 #endif
源文件
1 #include "stackli.h"
2 #include <malloc.h>
3 #include <stdlib.h>
4
5 struct Node
6 {
7 ElementType Element;
8 PtrToNode Next;
9 };
10
11 int IsEmpty(Stack S)
12 {
13 return S->Next == NULL;
14 }
15
16 // 创建栈的头节点
17 Stack CreateStack(void)
18 {
19 Stack S = (Stack)malloc( sizeof(struct Node) );
20 if( S == NULL )
21 {
22 fprintf(stderr, "%s
", "Out of space!!!");
23 exit(-1);
24 }
25 S->Next = NULL;
26 return S;
27 }
28
29 // 销毁栈(包括头节点)
30 void DisposeStack(Stack S)
31 {
32 MakeEmpty(S);
33 free(S);
34 }
35
36 // 清空栈就是弹出所有数据
37 void MakeEmpty(Stack S)
38 {
39 if(S == NULL)
40 {
41 fprintf(stderr, "%s
", "Must use CreateStack first");
42 exit(-1);
43 }
44 else
45 while( !IsEmpty(S) )
46 Pop(S);
47 }
48
49 // 进栈, 插入到头节点之后
50 void Push(ElementType X, Stack S)
51 {
52 PtrToNode TmpCell = (PtrToNode)malloc( sizeof(struct Node) );
53 if(TmpCell == NULL)
54 {
55 fprintf(stderr, "%s
", "Out of space!!!");
56 exit(-1);
57 }
58 else
59 {
60 TmpCell->Element = X;
61 TmpCell->Next = S->Next;
62 S->Next = TmpCell;
63 }
64 }
65
66 // 返回栈顶元素, 注意S不能为空
67 ElementType Top(Stack S)
68 {
69 if( IsEmpty(S) )
70 {
71 fprintf(stderr, "%s
", "Empty stack");
72 return -1;
73 }
74 else
75 return S->Next->Element;
76 }
77
78 // 出栈, 删除头节点的后继
79 void Pop(Stack S)
80 {
81 if( IsEmpty(S) )
82 {
83 fprintf(stderr, "%s
", "Empty stack");
84 }
85 else
86 {
87 PtrToNode P = S->Next;
88 S->Next = P->Next;
89 free(P);
90 }
91 }
测试文件
1 #include <stdio.h>
2 #include "stackli.h"
3
4 main( )
5 {
6 Stack S;
7 int i;
8
9 S = CreateStack( );
10 for( i = 0; i < 10; i++ )
11 Push( i, S );
12
13 while( !IsEmpty( S ) )
14 {
15 printf( "%d ", Top( S ) );
16 Pop( S );
17 }
18
19 DisposeStack( S );
20 return 0;
21 }