手把手写数据结构之栈操作

  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 }

 

posted @ 2013-08-07 22:33  夕相待  阅读(441)  评论(0编辑  收藏  举报