编程方式6 笔记 stack

来源:互联网 发布:java身份证号判断性别 编辑:程序博客网 时间:2024/06/16 06:18

int栈

typedef struct{    int* elems;    int logicallen;//当前元素个数    int alloclength;//最大容量}stack;void StackNew(stack* s);void StackDespose(stack* s);void StackPush(stack* s,int value);int StackPop(stack* s);

stack.c

void StackNew(stack *s){    s->loglength=0;    s->alloclength=4;    s->elems=malloc(4*sizeof(int));    assert(s->elems!=NULL;}void StackDispose(stack *s){    free(s->elems);    //不能写free(s),因为s不完全是动态分配的}void StackPush(stack *s,int value){    if(s->loglength==s->alloclength)    {        s->alloclength*=2;        s->elems=realloc(s->elems,s->alloclength*sizeof(int));        assert(s->elems!=NULL);    }    s->elems[s->loglenth]=value;    s->loglenth++;}int StackPop(stack *s){    assert(s->loglenth>0);    s->loglenth--;    return s->elems[s->loglength];}
stack s;StackNew(&s);for(int i=0;i<5;i++){    StackPush(&s,i);}SatckDispose(&s);void StackNew(stack *s){    s->logicallen=0;    s->alloclen=4;    s->elems=malloc(4*sizeof(int));    assert(s->elems!=NULL);}

泛型栈

typedef struct{    void* elems;    int elemSize;//元素大小不知道    int logicallen;//当前元素个数    int alloclength;//最大容量}stack;void StackNew(stack* s,int elemSize);void StackDespose(stack* s);void StackPush(stack* s,void* elemAddr);int StackPop(stack* s,void* elemAddr);

stack.c

void StackNew(stack *s,int elemSize)//s应该按引用传递{    assert(s->elemSize>0);    s->loglength=0;    s->alloclength=4;    s->elems=malloc(4*elemSize);    assert(s->elems!=NULL;}void StackDispose(stack *s){    free(s->elems);    //不能写free(s),因为s不完全是动态分配的}void StackPush(stack *s,void *elemAddr){    if(s->loglength==s->alloclength)    {        StackGrow(s);    }    void* target=(char* )s->elems+s->loglength*s->elemSize;    //void指针不能做算数运算所以要先转为char*(unsigned long*也行)再转void*    memcpy(target,elemAddr,s->elemSize);    s->loglength++;}static void StackGrow(stack *s){    s->alloclength*=2;    s->elems=realloc(s->elems,s->alloclength*sizeof(int));    assert(s->elems!=NULL);}int StackPop(stack *s,void * elemAddr){    void* source=(char*)s->elems+(s->loglength-1)*s->elemSize    memcpy(elemAddr,source,s->elemSize);    s->loglength--;}