在C中堆叠存储pop ant top结果

时间:2016-06-21 12:48:51

标签: c struct stack

考虑一个堆栈,最多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;

其他功能:

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;
}

结果(仅限lastf):

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

由于某种原因,第一次pop调用失败,不仅谴责已删除元素的列表,还谴责顶级元素结果。 有关为什么的任何建议?

2 个答案:

答案 0 :(得分:2)

  1. 您将MAX+1元素推送到堆栈,因为循环推送MAX元素,循环后再调用push
  2. 您的pop实施不正确,因为该行:

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

    指针p将指向s->values[s->size]而不是s->values[s->size-1],因为s->size的减量将在评估并分配到p之后发生。

  3. 在表达式中使用递增/递减运算符被认为是不好的做法,并且由于这些错误而强烈反对。

  4. 如果可能的话,使用索引运算符[]代替指针运算,它更易读,更不容易出错:

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

答案 1 :(得分:0)

我是那些评论代码清晰度的人。如果使用数组,如果使用[]索引而不是指针算法,则不太可能遇到麻烦。

那就是说,我认为问题是pop有一个越界问题。在MAXmain中推送s->size==MAX个元素后。因此,pop访问*(s->values + MAX) == s->values[MAX],这实际上是数组末尾之后的元素。该数组从0MAX-1,而不是从1MAX。例如,如果size==1,您实际上需要s->values[0],即第一个元素,而不是不存在的s->values[1]

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

之类的内容