考虑一个堆栈,最多有 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 调用失败, 这不仅会影响已删除元素的列表,还会影响顶部元素的结果。 关于原因有什么建议吗?
最佳答案
- 您将
MAX+1
元素压入堆栈,因为循环压入MAX
元素,并且循环后还有一个push
调用。 由于以下行,您的
pop
实现不正确:int *p = s->values + s->size--;
指针
p
将指向s->values[s->size]
而不是s->values[s->size-1]
因为s->size
的递减将在计算并赋值给p
之后发生。在表达式中使用递增/递减运算符理所当然地被认为是不好的做法,并且强烈建议不要这样做,正是因为这些错误。
如果可能的话,使用索引运算符
[]
而不是像这样的指针算术更具可读性并且更不容易出错: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/