【发布时间】:2012-09-18 20:32:42
【问题描述】:
我正在用 C 实现通用堆栈,但我在 stackPop 方法中遇到了问题。我的结构如下:
“Stack.h”文件
typedef struct{
void *elems;
int elemSize;
int allocLength;
int logLength;
void (*freefnc)(void *);
} Stack;
void stackNew(Stack *s, int elemSize, void (*freefnc)(void *));
void stackDispose(Stack *s);
void stackPush(Stack *s, void *elemAddr);
void stackPop(Stack *s, void *target);
Stack.c
#inlcude<Stack.h>
void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)){
s.allocLength = 4;
s.logLength = 0;
s.elemSize = elemSize;
s.elems = malloc(4*elemSize);
s.freefnc = freefnc;
}
void stackDispose(Stack *s){
if(s.freefnc!=NULL){
for(int i=0; i<s.logLength; i++){
freefnc((char *)s.elems+i*s->elemSize);
}
}
free(s.elems);
}
void Stringfree(void *elem){
free(*(char**)elem);
}
void stackPush(Stack *s, void *elemAddr){
if(s.alloclength == s.logLength){
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.alloclength*s.elemSize);
assert(s.elems!=NULL);
}
void stackPop(Stack *s, void *elemAddr){
void *source = (char *)s.elems + (s.logLength-1)*s.elemSize;
memcpy(elemAddr,source,s.elemSize);
s.logLength--;
}
如何在 stackPop 函数中返回/获取弹出的值?我不想更改实现,但如果有一种好的方法可以尽可能地保持实现相同,那么我将不胜感激。其他方法也是可以接受的。
【问题讨论】:
-
在
stackPop. 中简单地返回一个值会更有意义。为什么实现必须保持不变? -
@Vulcan 他可能指的是堆栈的实现,而不是函数。
-
那很好,但我考虑了一段时间,如果你觉得改变实现并没有改变这个概念,那么你能提供一个更好的方法吗?
-
我希望我的堆栈实现尽可能相同。
-
是的,我认为将其设为镜像
stackPush没有问题。目前的方法有什么问题?