栈的泛型(2),纯C实现
stack.h
typedef struct{
void* elems;
int elemSize;
int loglength;
int alloclength;
}stack;
void StackNew( stack* s, int elemSize);
void StackDispose(stack* s);
void StackPush(stack* s,void* elemAddr);
void StackPop(stack* s, void* elemAddr);
stack.c
void *StackNew(Stack* s, int elemSize)
{
assert(s->elemSize > 0);
s->elemSize = elemSize;
s->elemSize = elemSize;
s->loglength = 0;
s->alloclength = 4;
s->elems = malloc(4 * elemsSize);
assert( s->elems !=NULL);
}
void *Dispose(stack*s)
{
free(s->elems);
}
void StackPush(stack* s,void* elemAddr)
{
if (s->loglength == s->alloclength)
stackGrow(s);
void * target = (char*)s->elems+s->loglength*s->elemSize;
memcpy(target,elemAddr, s->elemSize);
s->loglength++;
};
static void StackGrow(stack* s)
{
s->alloclength *= 2;
s->elems = realloc(s->elems, s->elmeSize);
};
StackPop(stack* s,void* elemAddr)
{
void*Source =
(char*)s->elems + (s->loglength-1)*(s->elemSize);
memcpy(elemAddr,Source,s->elemSize);
s->loglength--;
}
字符串栈实现实例
int main()
{
const char* friends[] = {"AI","Bob","Carl"};
stack stringstack;
StackNew(&stringstack,sizeof(char*));
for (int i=0;i<3;i++){
char* cpy = strup(friends[i]);
StackPush(&stringstack, &cpy);
}
char* name;
for (int i=0; i<3;i++){
StackPop(&stringstack,&name);
printf("%s\n",name);
free(name);
StackDispose(&stringstack);
}
}