标签:动态内存 ini names color over can error main 存储空间
/*************************************************************** Author :h-j-w Created Time :2017-11-26 File Name :顺序栈 **************************************************************/ #include<bits/stdc++.h> #define STACK_INIT_SIZE 100 ///存储空间初始分配量 #define STACKINCREMENT 10 ///存储空间分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW 1 using namespace std; typedef int SElemType; typedef int Status; typedef struct { SElemType *base;//在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize;//当前已分配的存储空间,以元素为单位 }SqStack; /**************************************************************/ //构建一个空栈 Status InitStack(SqStack &S) { S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } /**************************************************************/ //判断栈是否为空 Status StackEmpty(SqStack S) { if(S.base==S.top) return true; else return false; } /**************************************************************/ //求栈的长度 int StackLength(SqStack S) { if(S.top==S.base) return ERROR; return S.top-S.base; } /**************************************************************/ //取栈顶元素,若栈不空用e返回其值,否则返回false int GetTop(SqStack S) { if(S.top==S.base) return false; else return *(S.top-1); } /**************************************************************/ //插入e作为新的栈顶元素 Status Push(SqStack &S,SElemType e) { if((S.top-S.base)>=S.stacksize)///栈满,再开一段存储空间 { S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); ///realloc()函数,实现动态内存调整 if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top=e; S.top++; return OK; } /**************************************************************/ //删除栈顶元素 Status Pop(SqStack &S, int &e) { if(S.top==S.base) return ERROR; else { e=*(S.top-1); S.top--; return OK; } } /**************************************************************/ //清空栈 Status ClearStack(SqStack &S) { int e; while(!StackEmpty(S))///若栈不空StackEmpty(S)返回false,取非(!),则pop() { Pop(S,e); } return OK; } /**************************************************************/ //销毁栈 Status DestroyStack(SqStack &S) { ClearStack(S); free(S.base); S.top=NULL; S.base=NULL; return OK; } /**************************************************************/ //从栈底遍历到栈顶元素 bool visit(SElemType a) { printf("%d",a); return true; } Status StackTraverse(SqStack S,bool(*visit)(SElemType)) { if(S.top==S.base) return ERROR; SElemType *p; p=S.base; while(p<S.top) { (*visit)(*p); if(p!=S.top-1) printf("<---"); else printf("\n"); p++; } return OK; } /**************************************************************/ int main() { int n; SqStack S; InitStack(S); printf("请输入入栈元素(以0为结束标志):"); while(~scanf("%d",&n)) { if(n == 0) break; Push(S,n); } printf("----------------------------\n"); printf("栈的长度为:%d\n",StackLength(S)); printf("----------------------------\n"); printf("栈内的元素:\n"); StackTraverse(S,visit); printf("----------------------------\n"); int e; Pop(S,e); printf("删除的栈顶元素为:%d\n",e); printf("栈的长度为:%d\n",StackLength(S)); printf("栈内的元素:\n"); StackTraverse(S,visit); printf("----------------------------\n"); int d=GetTop(S); printf("栈顶元素为:%d\n",d); printf("----------------------------\n"); printf("ClearStack后"); ClearStack(S); printf("栈的长度为:%d\n",StackLength(S)); if(StackEmpty(S)) { printf("Empty stack...\n"); } printf("----------------------------\n"); return 0; } /* 1 2 3 4 5 0 */
标签:动态内存 ini names color over can error main 存储空间
原文地址:http://www.cnblogs.com/hhkobeww/p/7898617.html