首页 > 代码库 > 顺序栈
顺序栈
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。