最近在看编程范式,前半部分主要以C来介绍的,今天学习下栈~
typedef struct
{
void* elemstr;//存储栈中的元素
int contentlen;//栈申请空间
int loglength;//当前栈使用空间
unsigned int size;//元素类型的大小
}pstack;
void InitStack(pstack *s,unsigned int size);
void DestoryStack(pstack *s);
void pushStack(pstack *s,void* elem);
void popStack(pstack *s,void* elem);
void InitStack(pstack *s, unsigned int size)
{
s->size = size;
s->contentlen = 4;//初始容器大小为4
s->loglength = 0;
s->elemstr = malloc(s->contentlen * size);
assert(s->elemstr != NULL);
}
void DestoryStack(pstack *s)
{
free(s->elemstr);
}
void pushStack(pstack *s, void* elem)
{
if (s->loglength >= s->contentlen)
{
s->contentlen *= 2;//每次以两倍扩展
s->elemstr = realloc(s->elemstr, s->contentlen*s->size);//重新分配空间
}
void* temp = (char*)s->elemstr + s->loglength * s->size;
memcpy(temp, elem, s->size);
s->loglength++;
}
void popStack(pstack *s,void* elem)
{
s->loglength--;
void* temp = (char*)s->elemstr + s->loglength * s->size;
memcpy(elem,temp,s->size);
}
备注:
realloc的使用:检查malloc后续空间是否足够,足够则直接向后扩展,否则重新申请一块空间,并将原来的数据拷贝过来。