Stack create(int c)
{
Stack S=(Stack)malloc(sizeof(struct stack));
S->size=c;
S->top=-1;
S->array=(char *)malloc(sizeof(char)*c);
return S;
}
Stack makeEmpty(void)
{
Stack *S1=create(100);
S1[0]->top=-1;
return S1;
}
char pop(Stack S)
{
return S->array[S->top--];
};
int main(void)
{
Stack *S1;
S1=makeEmpty();
int j;
int k=0;
char result[30];
for(j=0; j<2; j++)
{
char result1=pop(S1);
strcat(result, result1);
k++;
}
}
我跳过了一些部分,例如typedef struct stack Stack
;
我想要做的是在for循环工作时从堆栈中弹出元素。然后,将这些元素存储在result
的新数组中。为了检查它是否有效,我打印出来但是我遇到了运行时错误。如何存储元素以及如何将其打印出来?
答案 0 :(得分:0)
我已经复制并粘贴了您的代码,但它并没有被编译。我觉得 你要么不发布你的实际代码,也不要编写和阅读编译器警告。很难帮助你。这里有一些我注意到的事情:
1。
create
必须返回指向Stack
的指针,而不是对象。
Stack *create(int c)
{
Stack *S = malloc(sizeof *S);
S->size=c;
S->top=-1;
S->array = malloc(c);
return S;
}
2。
makeEmpty
Stack *makeEmpty(void)
{
Stack *S1=create(100);
S1->top=-1;
return S1;
}
3。
pop
应该指向Stack
,而不是对象
char pop(Stack *S)
{
return S->array[S->top--];
};
在这里你应该检查你的堆栈上是否有元素。 int pop(Stack *S, char *val)
,它返回1并在*val
上写入
成功,并返回0否则会更好。
4。
从您的pop
来看,您只推动char
。我不明白你的意思
正在尝试strcat
。无论哪种方式,你都在做strcat
错误。您
声明一个包含100个空格的堆栈,但您只声明了30个空格
为result
。如果你的堆栈中有超过31个元素怎么办?我知道
你只是在检查2个元素,但它很容易被忽视
扩展它以遍历所有堆栈而不改变内存要求
result
。
同样strcat
是一个与C-Strings一起使用的函数,这意味着它需要
C-字符串。 C-String 必须被\0
终止,你的不是。你有
看起来像C字符串的东西,但它不是。如果你坚持使用
strcat
,你应该这样做:
for(j=0; j<2; j++)
{
char result1[] = { pop(S1), 0 };
strcat(result, result1);
}