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);
}