1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5 #define STACK_INIT_SIZE 1
6 #define STACKINCREMENT 2
7 #define OK 1
8 #define FALSE 0
9 #define TRUE 1
10 #define ERROR 0
11
12 typedef int Status;
13 typedef int SElemType;
14
15 typedef struct SqStack
16 {
17 SElemType *base;
18 SElemType *top;
19 int stacksize;
20 }SqStack;
21
22 Status InitStack(SqStack *S)
23 {
24 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
25 if(!(*S).base)
26 exit(OVERFLOW);
27 (*S).top = (*S).base;
28 (*S).stacksize = STACK_INIT_SIZE;
29 return OK;
30 }
31
32 Status DestroyStack(SqStack *S)
33 {
34 free((*S).base);
35 (*S).base=NULL;
36 (*S).top=NULL;
37 (*S).stacksize=0;
38 return OK;
39 }
40
41 Status ClearStack(SqStack *S)
42 {
43 (*S).top=(*S).base;
44 return OK;
45 }
46
47 int StackLength(SqStack S)
48 {
49 return S.top-S.base;
50 }
51
52 Status StackEmpty(SqStack S)
53 {
54 if(S.top==S.base)
55 return TRUE;
56 else
57 return FALSE;
58 }
59
60 Status GetTop(SqStack S,SElemType *e)
61 {
62 if(S.top>S.base)
63 {
64 *e=*(S.top-1);
65 return OK;
66 }
67 else
68 return ERROR;
69 }
70
71 Status Push(SqStack *S,SElemType e)
72 {
73 if((*S).top-(*S).base>=(*S).stacksize)
74 {
75 (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
76 if(!(*S).base)
77 exit(OVERFLOW);
78 (*S).top=(*S).base+(*S).stacksize;
79 (*S).stacksize+=STACKINCREMENT;
80 }
81 *((*S).top)++=e;
82 return OK;
83 }
84
85 Status Pop(SqStack *S,SElemType *e)
86 {
87 if((*S).top==(*S).base)
88 return ERROR;
89 *e=*--(*S).top;
90 return OK;
91 }
92
93 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
94 {
95 while(S.top>S.base)
96 visit(*S.base++);
97 printf("\n");
98 return OK;
99 }
100
101 Status visit(SElemType c)
102 {
103 printf("%d ",c);
104 return OK;
105 }
106
107 void main()
108 {
109 int j;
110 SqStack s;
111 SElemType e;
112 if(InitStack(&s)==OK)
113 for(j=1;j<=12;j++)
114 Push(&s,j);
115 printf("栈中元素依次为:");
116 StackTraverse(s,visit);
117 Pop(&s,&e);
118 printf("弹出的栈顶元素 e=%d\n",e);
119 printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
120 GetTop(s,&e);
121 printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
122 ClearStack(&s);
123 printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
124 DestroyStack(&s);
125 printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
126 }