1 /** 2 * 数据结构中的栈C语言实现 3 * 参考书籍:《数据结构C语言版》.严蔚敏 吴伟民 著. 4 * 编译环境:windows 7 x64 5 * 编辑软件:c-free 5.0 6 * 树琦博客:http://www.cnblogs.com/shuqi 7 * 文件名:stack.cpp 8 * 创建时间:2014年4月21日 19:49:19 9 */ 10 11 /********************************引入头文件**************************************************/ 12 #include<stdio.h> 13 #include<stdlib.h> 14 #include<malloc.h> 15 16 /**********************************定义*******************************************************/ 17 /*定义状态码*/ 18 #define OK 0 //正常 19 #define ERROR -1 //出错 20 #define OVERFLOW -2 //内存申请不成功 21 #define DEFSIZE 10 //栈的默认大小 22 #define INCREAMSIZE 10 //每次当栈空间满时,增量 23 /* 定义结构体 */ 24 typedef int Status; //定义状态 25 typedef int ElemType; //定义栈内元素类型 26 27 //定义栈的的数据结构 28 typedef struct{ 29 ElemType *base; //栈底指针 30 ElemType *top; //栈顶指针 31 int stackSize; // 栈大小 32 int realSize; // 栈当前大小,可以不定义 33 }SqStack; 34 35 /*********************************stack操作方法**************************************************/ 36 37 //初始化一个栈 38 Status InitStack(SqStack &sqstack){ 39 //申请默认栈大小 40 sqstack.base = (ElemType*)malloc(DEFSIZE*sizeof(ElemType)); 41 if(!sqstack.base) exit(OVERFLOW); 42 43 sqstack.top = sqstack.base; 44 sqstack.stackSize = DEFSIZE; 45 sqstack.realSize = 0; 46 return OK; 47 } 48 49 //进栈 50 Status Push(SqStack &sqstack,ElemType &e){ 51 if(sqstack.top-sqstack.base>=sqstack.stackSize){ 52 sqstack.base = (ElemType*)realloc(sqstack.base,(sqstack.stackSize+INCREAMSIZE)*sizeof(ElemType)); 53 //如果申请失败返回溢出 54 if(!sqstack.base) exit(OVERFLOW); 55 sqstack.top = sqstack.base + sqstack.stackSize; 56 sqstack.stackSize = sqstack.stackSize + INCREAMSIZE; 57 } 58 *sqstack.top++ = e; 59 sqstack.realSize++; 60 return OK; 61 } 62 63 //出栈 64 Status Pop(SqStack &sqstack,ElemType &e){ 65 if(sqstack.base==sqstack.top){ 66 exit(ERROR); 67 } 68 e = *--sqstack.top; 69 sqstack.realSize--; 70 return OK; 71 } 72 73 //得到栈顶元素 74 Status GetTop(SqStack &sqstack,ElemType &e){ 75 if(sqstack.base==sqstack.top){ 76 exit(ERROR); 77 } 78 e = *(sqstack.top-1); 79 return OK; 80 } 81 82 //判断栈是否为空 83 bool IsEmpty(SqStack &sqstack){ 84 if(sqstack.realSize>0) 85 return false; 86 else 87 return true; 88 } 89 90 //销毁栈 91 Status DestroyStack(SqStack &sqstack){ 92 sqstack.top = sqstack.base; 93 free(sqstack.base); 94 sqstack.realSize = 0; 95 sqstack.stackSize = DEFSIZE; 96 return OK; 97 } 98 99 //得到栈的元素个数 100 int StackLength(SqStack &sqstack){ 101 return sqstack.realSize; 102 } 103 104 /*******************************主函数************************************************/ 105 int main(int argc, char *argv[]){ 106 107 SqStack sqstack; 108 int N = 0; //用于记录输入栈的个数 109 int temp = 0; //用于临时存栈 110 111 /****初始化栈***/ 112 InitStack(sqstack); 113 printf("初始化时,堆的大小为:%d ",sqstack.stackSize); 114 115 /**根据输入来填充栈**/ 116 printf("请入你想要输入几个数据进栈:"); 117 scanf("%d",&N) ; 118 while(N--){ 119 scanf("%d",&temp); 120 Push(sqstack,temp); 121 printf("进栈的大小为:%d ",temp); 122 printf("压栈后,栈的大小为:%d,%d ",temp,sqstack.stackSize); 123 124 } 125 /**得到栈顶元素**/ 126 GetTop(sqstack,temp); 127 printf("得到栈顶元素为:%d",temp); 128 129 /**将栈的元素逐一出栈**/ 130 /* printf("现在开始逐一出栈: "); 131 while(!IsEmpty(sqstack)){ 132 //如果栈不为空则进行出栈 133 Pop(sqstack,temp); 134 printf("%d ",temp); 135 } 136 printf(" 栈输出完成!! "); 137 */ 138 139 DestroyStack(sqstack); 140 printf("销毁栈完成!! "); 141 142 143 144 scanf("%d",&temp); 145 return 0; 146 }