首页 > 代码库 > 顺序栈

顺序栈

  1 /**
  2  * @brief 栈的顺序表示与实现
  3  *
  4  * @author amur-leopard
  5  *
  6  * @date 2014/06/01
  7  */
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 
 11 //-----------------预定义常量和类型-------------------
 12 #define OK           1
 13 #define ERROR        0
 14 #define OVERFLOW     -1
 15 
 16 typedef int status; // 函数类型,其值是函数结果状态代码
 17 
 18 
 19 //-----------------栈的顺序存储表示-------------------
 20 #define STACK_INIT_SIZE 100 // 存储空间的初始分配量
 21 #define STACK_INCREMENT 10 // 存储空间的分配增量
 22 
 23 typedef struct
 24 {
 25     int *base;
 26     int *top;
 27     int stack_size;
 28 }seq_stack;
 29 
 30 
 31 //------------------基本操作的声明--------------------
 32 status init(seq_stack &stack); // 初始化栈
 33 status push(seq_stack &stack, int e); // 入栈
 34 status pop(seq_stack &stack, int &e); // 出栈
 35 
 36 
 37 //------------------基本操作的实现--------------------
 38 /**
 39  * @brief 初始化顺序栈
 40  * 
 41  * @param 待初始化的栈
 42  *
 43  * @return 函数状态
 44  */
 45 status init(seq_stack &stack)
 46 {
 47     stack.top = stack.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
 48     if(!stack.top)
 49     {
 50         exit(OVERFLOW);
 51     }
 52     stack.stack_size = STACK_INIT_SIZE;
 53     return OK;
 54 }
 55 
 56 /**
 57  * @brief 入栈
 58  *
 59  * @param stack 栈
 60  * @param e 入栈元素
 61  *
 62  * @return 函数状态
 63  */
 64 status push(seq_stack &stack, int e)
 65 {
 66     int *newbase; // 新存储空间的基址
 67     if(stack.top - stack.base >= stack.stack_size) // 存储空间已满
 68     {
 69         // 增加存储空间
 70         newbase = (int *)realloc(stack.base, (stack.stack_size + STACK_INCREMENT) * sizeof(int));
 71         if(!newbase)
 72         {
 73             exit(OVERFLOW);
 74         }
 75         stack.top = newbase + (stack.top - stack.base);
 76         stack.base = newbase;
 77         stack.stack_size += STACK_INCREMENT;
 78     }
 79     *stack.top = e;
 80     ++stack.top;
 81     return OK;
 82 }
 83 
 84 /**
 85  * @brief 出栈
 86  *
 87  * @param stack 栈
 88  * @param e 用于返回栈顶元素
 89  *
 90  * @return 函数状态
 91  */
 92 status pop(seq_stack &stack, int &e)
 93 {
 94     if(stack.top - stack.base == 0) // 空栈
 95     {
 96         return ERROR;
 97     }
 98     --stack.top;
 99     e = *stack.top;
100     return OK;
101 }
102 
103 
104 //-----------------------测试-------------------------
105 /**
106  * @brief 测试函数
107  */
108 void main()
109 {
110     int e; seq_stack stack; init(stack);
111 
112     if(OK == push(stack, 11)) printf("push succeed! 11\n");
113     if(OK == push(stack, 22)) printf("push succeed! 22\n");
114     if(OK == push(stack, 33)) printf("push succeed! 33\n");
115 
116     if(OK == pop(stack, e)) printf("pop succeed! %d\n", e);
117     if(OK == pop(stack, e)) printf("pop succeed! %d\n", e);
118     if(OK == pop(stack, e)) printf("pop succeed! %d\n", e);
119     if(ERROR == pop(stack, e)) printf("empty!\n");
120 
121     system("pause");
122 }