将x插入程序时如何显示堆栈。

#include <stdio.h>
#include <stdlib.h>

struct Node
{
    int Data;
    struct Node* next;
} * top;

void popStack()
{
    struct Node *temp, *var = top;
    if (var == top)
    {
        top = top->next;
        free(var);
    }
    else
        printf("\nStack Empty");
}

void push(int value)
{
    struct Node* temp;
    temp = (struct Node*)malloc(sizeof(struct Node));
    temp->Data = value;
    if (top == NULL)
    {
        top = temp;
        top->next = NULL;
    }
    else
    {
        temp->next = top;
        top = temp;
    }
}

void display()
{
    struct Node* var = top;
    if (var != NULL)
    {
        printf("\nElements are as:\n");
        while (var != NULL)
        {
            printf("\t%d\n", var->Data);
            var = var->next;
        }
        printf("\n");
    }
    else
        printf("\nStack is Empty");
}

int main(int argc, char* argv[])
{
    printf(" Wellcome to Basic Stacking. \n");
    top = NULL;
    while (1)

    {


当我插入“ x”时,我希望程序显示堆栈并退出,但在此程序中插入x后不起作用,这将是无限循环,并且不显示堆栈且不退出我该怎么办? ?

        char x ;

        int value;
        if (value != x)
        {

            printf("please enter Your Name:");
            scanf("%d", &value);
            push(value);
            fflush(stdin);
            display();
        }
        else
        {
            // popStack();
            display();
            break;
        }
    }
    getch();
}

最佳答案

一些程序员已经发现了,但是我想更明确一点:

char x;
int value;
if (value != x)


x和value都未初始化,因此可以保存任何值。如果比较它们,它们将不太可能匹配,但是即使在您第一次进入循环(导致立即退出)时,它们也可能偶然发生。变量x保持'x'的值也不是很可能–最终,读取未初始化的变量仍然是未定义的行为...

下一个问题是:您只需使用scanf("%d")。如果键入'x'字符,则尝试读取输入将失败,因为该字符不能被扫描为数字。因此,您必须先读取一个字符串,然后解析它。将两个错误修复在一起,您的代码可能如下所示:

char buffer[128];
while(1)
{
    if(!fgets(buffer, sizeof(buffer), stdin))
        break; // some error occured
    if(*buffer == 'x') // you can compare directly, you don't need a char x = 'x'; ...
        break;
    int value;
    char c;
    if(sscanf(buffer, "%d %c", &value, &c) == 1)
    {
        // ...
    }
    else
    {
        puts("invalid input");
        fflush(stdout);
    }
}


扫描数字后的其他字符(重要:跳过空格需要使用空格,即从fgets终止的换行符)并检查sscanf的返回值,从而检测到无效输入,例如“ abc”或“ 1xyz” '。

另外,看看您的popStack函数:

struct Node* var = top;
if (var == top)


这将始终是正确的,即使top顶部是NULL:然后var也是NULL,并且NULL等于自身,当然...

您应该这样做:

if (top)
{
    struct Node* var = top;
    top = top->next;
    free(var);
}


好的做法是始终检查malloc的返回值。尽管它不会在像您这样的小程序中失败,但是如果您从一开始就习惯了,那么在以后编写较大的程序时,您就不会忘记它...

连同一些简化的代码(允许的,仅限化妆品,但如果没有必要...):

struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
if(temp)
{
    temp->Data = value;
    temp->next = top;
    top = temp;
}
else
{
    // appropriate error handling
}


最后一个建议:您的两个函数构成一个函数对,因此也希望在其名称中反映出来:“ push”和“ pop”或“ pushStack”和“ popStack”。

关于c - 我如何显示堆栈C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44387506/

10-13 06:44