为堆栈编写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,我知道了。我将编辑主要帖子。您使用
***
,因为您显然使用数组方法进行堆栈,有什么原因吗?界面看起来很可疑。