为堆栈编写C pop函数
嘿,我正在写一个堆栈函数,我在从堆栈顶部弹出值时遇到了麻烦。不过,我的推送功能似乎在工作。这是我推送和弹出的代码为堆栈编写C pop函数,c,pointers,stack,C,Pointers,Stack,嘿,我正在写一个堆栈函数,我在从堆栈顶部弹出值时遇到了麻烦。不过,我的推送功能似乎在工作。这是我推送和弹出的代码 void push(int num, int ** sp) { if (++(*sp) == NULL) printf("Stack Overflow"); else{ printf("sp for push = %p \n", *sp); **sp++ = num; } } int pop(int **sp)
void push(int num, int ** sp)
{
if (++(*sp) == NULL)
printf("Stack Overflow");
else{
printf("sp for push = %p \n", *sp);
**sp++ = num;
}
}
int pop(int **sp)
{
printf("sp for pop = %p\n", *sp);
num = (**sp)--;
printf("sp = %d\n",num);
printf("sp for pop = %p\n", *sp);
return num;
}
我在检查null条件以防止弹出甚至不在堆栈上的元素时也遇到了问题,但一次只能出现一个问题
不管怎样,当我按下15然后按下5时,函数的输出是这样的
sp for push = 0x1761014
sp for push = 0x1761018
sp for pop = 0x1761018
sp = 5
sp for pop = 0x1761018
5
其中sp是堆栈指针。请注意堆栈指针是如何以sizeof int递增的。我通过引用传递这两个指针,因此它们也应该更改它们所指向的内存中的位置,但是对于pop函数,当我对指针进行后减时,该值不会因某种原因而更改。有人能帮我解释一下吗?非常感谢您的帮助。基本错误,我需要更改指向数据的指针的地址,而不是指向指针的指针。新守则是:
int pop(int **sp)
{
printf("sp for pop = %p\n", *sp);
num = (**sp);
(*sp)--;
printf("sp = %d\n",num);
printf("sp for pop = %p\n", *sp);
return num;
}
在
pop
中,您正在递减堆栈中的值,而不是指向堆栈的指针。请记住,*sp
是堆栈指针,而不是**sp
。因此,您需要减小*sp
,而不是**sp
int pop(int **sp)
{
printf("sp for pop = %p\n", *sp);
/* num = (**sp)--; */ // ISSUE: Decrementing value instead of pointer
num = *(*sp)--;
printf("sp = %d\n",num);
printf("sp for pop = %p\n", *sp);
return num;
}
push
功能中也存在问题。虽然现在不会产生问题,但最好是解决它
void push(int num, int ** sp)
{
if (++(*sp) == NULL)
printf("Stack Overflow");
else{
printf("sp for push = %p \n", *sp);
// **sp++ = num; // ISSUE: increment not needed.
// Once incremented, it will NOT point
// to stack pointer anymore
**sp = num;
}
}
若要在按下时检查堆栈中是否有空间,以及在弹出时检查是否有任何元素,可以使用
index
变量跟踪堆栈中元素的数量
假设堆栈的最大容量为N
。将索引初始化为0
现在,无论何时按下,首先检查索引是否为index
,然后只按下(并将索引增加1
)。如果索引
不小于N
,则存在堆栈溢出
每当弹出时,首先检查索引是否为0,然后只弹出(并且按1
递减索引)。如果索引
不大于0
,则没有要弹出的元素
另外,值得一提的是,如果这个索引
被命名为堆栈指针-sp
,它指向堆栈的顶部,则更为自然。您可以将指针传递到堆栈的底部,并将其称为base
或其他名称。你的职能是:
void push(int num, int *base, int sp) { ... } // base: start address of stack,
int pop(int *base, int sp) { ... } // sp: index of top of stack
检查取消引用运算符*
。此代码中至少有三种不同的递增/递减方式。他们不可能都是对的。你应该做一些基本的调试来找出发生了什么。是的,谢谢Joachim,我知道了。我将编辑主要帖子。您使用***
,因为您显然使用数组方法进行堆栈,有什么原因吗?界面看起来很可疑。