Stack.h
typedef struct {
void *elems;
int elemSize;
int logicalLen;
int allocLen;
}Stack;
void StackNew(Stack *s,int elemSize);
void StackDispose(Stack *s);
void StackPush(Stack *s,void *elemAddr);
void StackPop(Stack *s,void *elemAddr);
static void StackGrow(Stack *s);
Stack.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "stack.h"
int main(){
Stack s;
StackNew(&s,sizeof(int));
int i = 0;
for(i = 0; i < 10; ++i){
StackPush(&s,&i);
}
for(i = 0; i < 10; ++i){
int number = 0;
StackPop(&s,&number);
printf("%d ",number);
}
printf("\n");
StackDispose(&s);
return 0;
}
void StackNew(Stack *s,int elemSize){
assert(elemSize > 0);
s->elemSize = elemSize;
s->logicalLen = 0;
s->allocLen = 4;
s->elems = malloc(s->allocLen * elemSize);
assert(s->elems != NULL);
}
void StackDispose(Stack *s){
free(s->elems);
}
void StackPush(Stack *s,void *elemAddr){
if(s->logicalLen == s->allocLen){
StackGrow(s);
}
void *target = (char *)s->elems + s->logicalLen * s->elemSize;
memcpy(target,elemAddr,s->elemSize);
s->logicalLen ++;
}
static void StackGrow(Stack *s){
s->allocLen *= 2;
s->elems = realloc(s->elems,s->allocLen * s->elemSize);
assert(s->elems != NULL);
}
void StackPop(Stack *s,void *elemAddr){
assert(s->logicalLen > 0);
s->logicalLen --;
void *source = (char *)s->elems + s->logicalLen * s->elemSize;
memcpy(elemAddr,source,s->elemSize);
}