堆栈没有成功将数字推入其中

时间:2017-12-12 16:42:01

标签: c arrays stack push bucket

我正在努力创造一个"桶"保存数组中的元素,当我访问push函数时,我想将x元素放在该数组中。我不明白为什么阵列一直都是空的。它打印输入:

" / N   / N   / N   堆栈是空的!   弹出:-9999   \ n   \ n   \ n   \ n   \ n   堆栈是空的!   弹出:-9999   \ n   \ n   \ n   \ n   \ n   \ n "

#include <stdio.h>
#include <stdlib.h>


typedef struct stivaStack
{
    int arr[10];
    int len;
}stivaStack_t;


void printStiva(stivaStack_t S)
{
    int i;
    for (i=0;i<S.len;i++)
        printf("%d ",S.arr[i]);
    printf("\n");
}

void stivaPush(int x, stivaStack_t S)
{
    if (S.len+1<10)
    {
        int a=S.len;
        S.arr[a]=x;
        S.len=a+1;
    }
    else
    printf("The stack is full can't place %d!\n",x);
}

int stivaPop(stivaStack_t S)
{
    if (S.len>0)
    {
        S.len--;
        return S.arr[S.len];
    }
    else
    {
        printf("The stack is empty!\n");
        return -9999;
    }
}

int main()
{

    stivaStack_t SS;
    SS.len=0;

    stivaPush(102,SS); printStiva(SS);
    stivaPush(25,SS); printStiva(SS);
    stivaPush(9,SS); printStiva(SS);
    printf("Popped: %d\n",stivaPop(SS)); printStiva(SS);
    stivaPush(3,SS); printStiva(SS);
    stivaPush(12,SS); printStiva(SS);
    stivaPush(29,SS); printStiva(SS);
    stivaPush(40,SS); printStiva(SS);
    printf("Popped: %d\n",stivaPop(SS)); printStiva(SS);
    stivaPush(155,SS); printStiva(SS);
    stivaPush(4,SS); printStiva(SS);
    stivaPush(19,SS); printStiva(SS);
    stivaPush(25,SS); printStiva(SS);
    stivaPush(49,SS); printStiva(SS);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

这些函数处理堆栈的副本而不是原始堆栈本身。

您必须通过引用函数来传递堆栈。

例如

void stivaPush(int x, stivaStack_t *S)
{
    if (S->len < 10)
        ^^^^^^^^^^^
    {
        int a = S->len;
        S->arr[a]=x;
        S->len=a+1;
    }
    else
    printf("The stack is full can't place %d!\n",x);
}

函数调用看起来像

stivaPush(102, &SS); 

当函数发出消息时,这也是一个坏主意。

上面的函数可以定义为

int stivaPush( stivaStack_t *S, int x )
{
    int success = S->len < 10;

    if ( success )
    {
        S->arr[len++] = x;
    }

    return success;
}

答案 1 :(得分:0)

我不明白为什么阵列一直都是空的。

因为您通过值将变量传递给函数。我们的意思是,你用变量调用函数,在被调用的函数中有另一个函数与这个函数具有相同的内容。然后你就可以了。在副本上。功能结束。复制被丢弃。那就结束了。原始变量仍然相同。

如何解决?

通过传递变量的地址,很好地模拟C中的引用传递。好吧,没有复杂的事情,理解这一点的简单方法是,不是传递变量的值,而是传递变量的地址。这里,在被调用函数中有一个局部变量,它具有与变量地址相同的内容。现在,您通过包含地址的变量副本访问该地址。您对存储在该地址中的变量进行更改。所以你所做的改变仍然存在。

怎么做?

嗯,这是在另一个答案中给出的。答案显示了如何使用代码完成它。不重复内容。