手把手写数据结构之栈操作
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 }