C-字符推送和弹出操作
C- Character Push and Pop operation
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
的新数组中。为了检查它是否有效,我打印出来但出现运行时错误。元素如何存储,如何打印出来?
我复制并粘贴了您的代码,但没有编译。我觉得
你要么没有发布你的实际代码,要么你懒得编译和阅读编译器警告。很难帮你。这里有一些我注意到的事情:
1。
create
必须 return 指向 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)
其中 returns 1 并写在 *val
上
成功,returns 0 否则会更好。
4。
从您的 pop
判断,您只推 char
。我不明白你的意思
正在尝试处理 strcat
。无论哪种方式,你都在做 strcat
错误。你
正在声明一个有 100 个空格的堆栈,但你只声明了 30 个空格
result
。如果堆栈中的元素超过 31 个怎么办?我知道
您只检查 2 个元素,但很容易忽略这一点,并且
在不改变内存要求的情况下扩展它以遍历所有堆栈
result
.
此外 strcat
是一个与 C 字符串一起工作的函数,这意味着它期望
C 弦。 C 字符串 必须 被 [=28=]
终止,而你的则不是。你有
看起来像 C 字符串的东西,但它不是。如果你坚持使用
strcat
,你应该这样做:
for(j=0; j<2; j++)
{
char result1[] = { pop(S1), 0 };
strcat(result, result1);
}
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
的新数组中。为了检查它是否有效,我打印出来但出现运行时错误。元素如何存储,如何打印出来?
我复制并粘贴了您的代码,但没有编译。我觉得 你要么没有发布你的实际代码,要么你懒得编译和阅读编译器警告。很难帮你。这里有一些我注意到的事情:
1。
create
必须 return 指向 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)
其中 returns 1 并写在 *val
上
成功,returns 0 否则会更好。
4。
从您的 pop
判断,您只推 char
。我不明白你的意思
正在尝试处理 strcat
。无论哪种方式,你都在做 strcat
错误。你
正在声明一个有 100 个空格的堆栈,但你只声明了 30 个空格
result
。如果堆栈中的元素超过 31 个怎么办?我知道
您只检查 2 个元素,但很容易忽略这一点,并且
在不改变内存要求的情况下扩展它以遍历所有堆栈
result
.
此外 strcat
是一个与 C 字符串一起工作的函数,这意味着它期望
C 弦。 C 字符串 必须 被 [=28=]
终止,而你的则不是。你有
看起来像 C 字符串的东西,但它不是。如果你坚持使用
strcat
,你应该这样做:
for(j=0; j<2; j++)
{
char result1[] = { pop(S1), 0 };
strcat(result, result1);
}