c - C 中的堆栈。存储 pop ant top 结果

标签 c struct stack

考虑一个堆栈,最多有 100 个整数。定义为:

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

这应该删除最后一个元素的values[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;
}

结果(仅最后一个 printf):

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

由于某种原因,第一次 pop 调用失败, 这不仅会影响已删除元素的列表,还会影响顶部元素的结果。 关于原因有什么建议吗?

最佳答案

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

关于c - C 中的堆栈。存储 pop ant top 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37944923/

相关文章:

c - 指向结构成员的指针,无需初始化

Calloc() 不分配零

c - 具有有限缓冲区的生产者/消费者

c++ - 我可以用 X64 为 ARM 构建 gcc 吗?

c - n 值较小的标准排序网络

java - 为什么这继续要求字符串?

c - 如何按C中的给定成员对结构数组进行排序

c - 有关于 C 结构顺序的任何保证吗?

C堆栈内存转储,为什么第一个参数出现两次?

c++ - C++ 中的 Stackdump 不显示堆栈跟踪