顺序栈c语言实现

    科技2022-07-12  111

    注意:记得自己每次写完一个函数库后,都要和别人的进行对比,取其长处,补己之短,使自己的代码更加完善和健壮

    //库函数头文件包含 #include<stdio.h> #include<malloc.h> #include<stdlib.h> //函数状态码定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status; typedef int SElemType; //栈元素类型 typedef struct Stack { SElemType *base; 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 DestroyStack(SqStack &S) { free(S.base); S.base=NULL; S.top=NULL; S.stacksize=0; return OK; } //清空栈 Status ClearStack(SqStack &S) { S.top=S.base;//保留首地址 return OK; } //入栈 Status Push(SqStack &S,SElemType e) //插入e为栈顶元素 { if(S.top-S.base==S.stacksize)//栈满重新开辟空间 { S.base=(SElemType*)realloc(S.base,(STACKINCREMENT+S.stacksize)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=(S.base+S.stacksize); S.stacksize=S.stacksize+STACKINCREMENT; } *S.top=e; S.top++; return OK; } //出栈 Status Pop(SqStack &S,SElemType &e) { if(S.base==S.top) return ERROR; e=*(S.top-1); S.top--; return OK; } //判栈空 Status StackEmpty(SqStack &S) { if(S.top==S.base)//空栈 { return TRUE; } else return FALSE; } //求栈长 int StackLength (SqStack S) { int i=0; SElemType *p; p=S.top; while(p!=S.base) { p--;i++; } return i; } //遍历栈 Status StackTraverse(SqStack S,Status (*visit)(SElemType)) { SElemType *p; p=S.base; while(p<S.top) { if(visit(*p)==ERROR)return ERROR; p++; } return OK; } Status StackPrintElem(SElemType e) { printf("%d\n",e); return OK; } SElemType Gettop(SqStack &S) { //if(S.top!=S.base) //return *(S.top-1); //有隐患对异常情况未作处理 if(S.top==S.base) return ERROR; else return *(S.top-1); } //修改栈顶元素的值 Status SetTopElem(SqStack &S,SElemType e) { if(S.base==S.top) { return ERROR; } *(S.top-1)=e; return OK; } int main(){ SqStack s; SElemType e; InitStack(s); Push(s,1); Push(s,2); Push(s,3); StackEmpty(s); StackLength(s); StackTraverse(s,StackPrintElem); Pop(s,e); SElemType a=Gettop(s); printf("%d\n",a); SetTopElem(s,4); StackTraverse(s,StackPrintElem); ClearStack(s); DestroyStack(s); return 0; }

    路漫漫其修远兮,吾将上下而求索 加油奥里给!

    Processed: 0.015, SQL: 8