堆栈无法成功将数字推入其中
Stack not succeding in pushing a number into it
我正在尝试制作一个 "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;
}
这些函数处理堆栈的副本而不是原始堆栈本身。
您必须通过对函数的引用来传递堆栈。
例如
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;
}
我不明白为什么数组一直是空的。
因为你按值将变量传递给函数。我们的意思是,你用变量调用函数,在被调用的函数中有另一个与这个函数内容相同的函数。然后你继续努力。在副本上。功能结束。副本被丢弃。到此结束。原来的变量还是一样
如何解决?
好吧,通过传递变量的地址来模拟C中的引用传递。好吧,为了不使事情复杂化,理解这一点的简单方法是传递变量的地址,而不是传递变量的值。这里同样在被调用函数中有一个局部变量,其内容与变量地址的内容相同。现在您可以通过包含地址的变量副本访问地址。您更改存储在该地址中的变量。所以您所做的更改会保留。
怎么做?
嗯,在另一个答案中给出了。答案显示了如何使用代码来完成。不重复内容。
我正在尝试制作一个 "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;
}
这些函数处理堆栈的副本而不是原始堆栈本身。
您必须通过对函数的引用来传递堆栈。
例如
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;
}
我不明白为什么数组一直是空的。
因为你按值将变量传递给函数。我们的意思是,你用变量调用函数,在被调用的函数中有另一个与这个函数内容相同的函数。然后你继续努力。在副本上。功能结束。副本被丢弃。到此结束。原来的变量还是一样
如何解决?
好吧,通过传递变量的地址来模拟C中的引用传递。好吧,为了不使事情复杂化,理解这一点的简单方法是传递变量的地址,而不是传递变量的值。这里同样在被调用函数中有一个局部变量,其内容与变量地址的内容相同。现在您可以通过包含地址的变量副本访问地址。您更改存储在该地址中的变量。所以您所做的更改会保留。
怎么做?
嗯,在另一个答案中给出了。答案显示了如何使用代码来完成。不重复内容。