1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5
6 #define STACK_SIZE 100 //存储空间个数
7
8 #define Test(arg) if(NULL == arg){\
9 printf("Invalid arg......\n");\
10 return -1;\
11 }
12
13 /********用户进程存储区虚拟内存栈的特性**************
14 *虚拟内存栈的空间有限大小(固定,32位系统一般12M左右)
15 *地址由高到低连续下降
16 *至少有一个栈顶指针top
17 *先进后出特性
18 *是一种内存存储机制
19 *********用户进程存储区虚拟内存栈的特性****************/
20
21
22
23
24
25 /**************数据结构栈的特性********************
26 *内存空间有限大小(固定)
27 *至少有一个栈顶指针top
28 *先进后出特性
29 *是一种算法机制
30 **************数据结构栈的特性**********************/
31
32 //数据封装
33 typedef struct element_type
34 {
35 int num;
36 }ELE_TYPE;
37
38
39 //结构栈信息
40 typedef struct stack_info
41 {
42
43 ELE_TYPE *base; //在栈构造之前和销毁之后,base的值为NULL
44 ELE_TYPE *top; //栈顶指针
45
46 int stacksize; //当前已分配的数据元素存储空间个数
47 }STACK_INFO;
48
49
50 /*******************************************
51 *Des: 初始化栈操作
52 *Ret: 成功返回0,失败返回-1
53 *********************************************/
54 int Init_Stack(STACK_INFO *stack, int stack_size)
55 {
56 Test(stack);//函数入口检测
57
58 if(stack_size <= 0 || stack_size > STACK_SIZE)
59 stack_size = STACK_SIZE;
60
61 //构造一个空栈
62 stack->base = (ELE_TYPE *)malloc(stack_size * sizeof(ELE_TYPE));
63 if(NULL == stack->base)
64 {
65 perror("Create_Stack");
66 return -1;
67 }
68
69 stack->top = stack->base;
70 stack->stacksize = stack_size;
71
72 return 0;
73 }
74
75
76 /*******************************************
77 *Des: 判断栈是否已经存满
78 *Ret: 真满: 1,假满: -1
79 *********************************************/
80 int Is_Full_Satck(STACK_INFO stack)
81 {
82 return (stack.top - stack.base >= stack.stacksize);
83 }
84
85
86 /*******************************************
87 *Des: 判断栈是否为空
88 *Ret: 真空: 1,假空: -1
89 *********************************************/
90 int Is_Empty_Stack(STACK_INFO stack)
91 {
92 return (stack.top == stack.base);
93 }
94
95
96
97 /*******************************************
98 *Des: 入栈操作
99 *Ret: 成功返回0,失败返回-1
100 *********************************************/
101 int Push_Stack(STACK_INFO *stack, ELE_TYPE e_value)
102 {
103 Test(stack);//函数入口检测
104
105 //栈是否已经满(也可以当栈满时追加空间)
106 if(Is_Full_Satck(*stack))
107 {
108 printf("The stack is full!\n");
109 return -1;
110 }
111
112 *(stack->top) = e_value;//现将数据放进去
113 stack->top++; //然后将栈顶指针指向下一个位置
114
115 return 0;
116 }
117
118
119
120 /*******************************************
121 *Des: 出栈操作
122 *Ret: 成功返回0,失败返回-1
123 *********************************************/
124 int Pop_Satck(STACK_INFO *stack, ELE_TYPE *e_value)
125 {
126 Test(stack);//函数入口检测
127
128 //判断栈是否已空
129 if(Is_Empty_Stack(*stack))
130 {
131 printf("The stack is empty!\n");
132 return -1;
133 }
134
135 stack->top--; //现将栈顶指针倒退操作
136 *e_value = *(stack->top); //然后取栈顶指针指向区域的元素
137
138 return 0;
139 }
140
141 /*******************************************
142 *Des: 从栈顶到栈底遍历元素(遍历不等于出栈也不需要出栈操作)
143 *Ret: 成功返回0,失败返回-1
144 *********************************************/
145 int Traverse_Stack(STACK_INFO stack, void (* Pfun)(void *))
146 {
147 if(Is_Empty_Stack(stack))
148 {
149 printf("The stack is empty!\n");
150 return -1;
151 }
152
153 ELE_TYPE *epoint = stack.top;
154
155 while(epoint != stack.base)
156 {
157
158 Pfun(epoint - 1);//执行回调函数
159 sleep(2);
160 epoint--;
161 }
162 printf("\nTraverse successfully........\n");
163
164 return 0;
165 }
166
167
168
169 /*******************************************
170 *Des: 清空栈操作(注意与销毁的区别)
171 *Ret: 成功返回0,失败返回-1
172 *********************************************/
173 int Empty_Stack(STACK_INFO * stack)
174 {
175 Test(stack);//函数入口检测
176
177 stack->top = stack->base;
178
179 return 0;
180 }
181
182 /*******************************************
183 *Des: 销毁栈操作
184 *Ret: 成功返回0,失败返回-1
185 *********************************************/
186 int Destory_Stack(STACK_INFO *stack)
187 {
188 Test(stack);//函数入口检测
189
190 Empty_Stack(stack);//清空栈
191
192 free(stack->base);//释放栈内存;
193
194 stack->base = stack->top = NULL;
195 stack->stacksize = 0;
196
197 return 0;
198 }