C-字符推送和弹出操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C-字符推送和弹出操作相关的知识,希望对你有一定的参考价值。

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必须返回指向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否则会更好。

从你的pop判断,你只推动char。我不知道你想用strcat做什么。无论哪种方式,你正在做strcat错误。您正在声明一个包含100个空格的堆栈,但您只为result声明了30个空格。如果你的堆栈中有超过31个元素怎么办?我知道你只是在检查2个元素,但很容易忽略它并扩展它以完成所有堆栈而不改变result的内存要求。

strcat也是一个与C-Strings一起使用的函数,这意味着它需要C-Strings。 C-String必须是终止,你的不是。你有一些看起来像C字符串的东西,但事实并非如此。如果你坚持使用strcat,你应该这样做:

for(j=0; j<2; j++)
{
    char result1[] = { pop(S1), 0 };
    strcat(result, result1);
}

以上是关于C-字符推送和弹出操作的主要内容,如果未能解决你的问题,请参考以下文章

java 堆栈 - 推送和弹出操作

Xcode 推送和弹出视图以保存数据

以编程方式切换自定义视图(推送和弹出)

Android:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法

使用导航控制器推送和弹出视图控制器:实现

UIViewController 推送和弹出中的问题