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


      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......
    ");
     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!
    ");
    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!
    ");
    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!
    ");
    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("
    Traverse successfully........
    ");
    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 }
  • 相关阅读:
    mongodb使用
    chromedriver对应chrome版本
    爬虫-selenium的使用
    爬虫-步骤
    爬虫-lxml用法
    xpath用发
    Chrome插件安装和用法
    正则用法
    五层协议
    git相关流程
  • 原文地址:https://www.cnblogs.com/xuyh/p/3244742.html
Copyright © 2020-2023  润新知