在C中的堆栈程序的实现中,当我打印pop()的值时,为什么我得到那个数字?它应该印有' 4'但我得到一个像号码的地址。这可能是什么问题?
#define MAX 5
typedef struct stack{
int data[MAX];
int top;
}stack;
int empty(stack *s){
if(s->top==-1)
return 1;
return 0;
}
int pop(stack *s){
int x;
x = s->data[s->top];
s->top = s->top -1;
return x;
}
void display(stack *s){
while(!(empty(&s)) && (s->top)!=-1){
printf("%d\n",s->data[s->top]);
s->top=s->top-1;
}
}
int main()
{
stack s;
init(&s);
push(&s,2);
push(&s,3);
push(&s,4);
display(&s);
printf("Popped element is: ");
printf("%d",pop(&s));
return 0;
}
输出:
4
3
2
Popped element is: 4200976
Process returned 0 (0x0) execution time : 0.019 s
Press any key to continue.
答案 0 :(得分:2)
在显示功能之后,您的top将始终具有值-1。 使用pop函数时,它将返回数组中的第-1个元素。 这是未定义的行为,因此返回的x可以是任何内容。
答案 1 :(得分:0)
函数display
无效。
对于初学者来说,这个电话
!(empty(&s))
的参数类型为stack **
,而参数类型为stack *
。应该有
!(empty(s))
虽然这项检查是多余的,可能会被删除。
该函数更改堆栈的数据成员top
。结果,在函数pop
之后调用的函数display
具有未定义的行为。
该功能可以看起来像
void display(const stack *s)
{
for ( int i = s->top; i != -1; i-- )
{
printf("%d\n",s->data[i]);
}
}
这是一个示范程序
#include <stdio.h>
#define MAX 5
typedef struct stack
{
int data[MAX];
int top;
} stack;
void init( stack *s )
{
s->top = -1;
}
int empty( const stack *s )
{
return s->top == -1;
}
void push( stack *s, int x )
{
if ( s->top + 1 != MAX ) s->data[++s->top] = x;
}
int pop( stack *s )
{
int x = s->data[s->top--];
return x;
}
void display(const stack *s)
{
for ( int i = s->top; i != -1; i-- )
{
printf("%d\n",s->data[i]);
}
}
int main(void)
{
stack s = { { 0 }, -1 };
init( &s );
push (&s, 2 );
push( &s, 3 );
push( &s, 4 );
display( &s );
printf( "Popped element is: " );
printf( "%d\n", pop( &s ) );
return 0;
}
产生预期结果
4
3
2
Popped element is: 4