堆叠在C中。存储弹出顶部结果

约翰·鲍尔

考虑一个堆栈,最大为100 int。定义为:

#define MAX 100

typedef struct stack {
    int size;
    int values[MAX];    
} STACK;

我有这个弹出功能:

int pop(STACK *s, int *x){
    if (s->size == 0) return 1;

    int *p = s->values + s->size--;
    *x = *p;

    return 0;
}

应该删除值[MAX]的最后一个元素,将该值存储在x地址,如果成功,则返回0;否则,返回0。

其他功能:

int top(STACK *s, int *x){
    if (s->size == 0) return 1;

    int *p = s->values + s->size;
    *x = *p;

    return 0; 
} //like pop function, it should store top element at address x.


void initStack(STACK *s){
    s->size = 0;
}

int push(STACK *s, int x){
    if (s->size >= MAX) return 1;

    int *p = (s->values);
    *(p + s->size++) = x;

    return 0;
}

这是我的主力。它仅在第一次弹出调用时失败:

int main(){
    struct stack s;
    STACK *p = &s;
    int i;
    int x,y,z,w,t;

    initStack(p);

    for(i = 0; i < MAX; i++)
        push(p,i);

    int res = push(p,MAX);

    for(i = 0; i < MAX; i++)
        printf("%d|", p->values[i]);

    printf("\nLast insertion: %d",res);

    pop(p,&x);
    pop(p,&y);
    pop(p,&z);
    pop(p,&w);
    top(p,&t);

    printf("\nThe elements %d|%d|%d|%d were removed. Current stack size: %d . Top element: %d.",x,y,z,w,p->size,t);

    return 0;
}

结果(仅最后打印):

The elements 1|99|98|97 were removed.Current stack size: 96 .Top element: 96.

由于某些原因,第一个pop调用失败,这不仅谴责了已删除元素的列表而且谴责了排名靠前的元素结果。有什么建议吗?

x

我对那些评论代码清晰性的人持第二看法。如果使用数组,则使用[]索引而不是指针算术时,麻烦的可能性将大大降低

就是说,我认为问题是pop出了界。MAX元素推入mains->size==MAX因此,pop访问*(s->values + MAX) == s->values[MAX],这实际上是在元件的数组的末尾。数组从0运行MAX-1,而不是从1到运行MAX例如,如果size==1实际需要s->values[0]第一个元素,而不是不存在s->values[1]

最小的更改是int *p = s->values + --s->size;,但是我同意这不是解决问题的正确方法。相反,使用类似*x = s->values[s->size-1]; --s->size;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章