我怎样才能显示堆栈C.

时间:2017-06-06 10:25:52

标签: c stack

当我将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();
}

3 个答案:

答案 0 :(得分:1)

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

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

x和值都未初始化,它们可以保存任何值。如果你比较它们,它们不太可能匹配,但即使在你第一次进入循环时它们也可能偶然发生(导致立即退出)。变量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)

这将总是为真,即使它顶部为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”。

答案 1 :(得分:0)

我发现了你的问题!这有点令人头疼,因为程序总是无限循环! 但问题是你正在用scanf("%d",&value)阅读字符。此scanf不会从缓冲区中删除输入,因此您执行的每个其他扫描将具有相同的输入(&#39; x&#39;),您的scanf无法读取。

要修改此更改,请执行以下操作:

printf("please enter Your Name:"); scanf("%d", &value);

printf("please enter Your Name:"); if(scanf("%d", &value)==0)value=x;

因此,如果scanf不成功,那么您假设用户想要退出。

这也是一个重复的问题,租约请参阅this question,了解更多详情。

答案 2 :(得分:0)

valuex的比较总是调用未定义的行为。 value的范围是循环体。每次循环时,你都会得到一个“新的”value

您的scanf正在寻找一个号码。如果您希望在按键盘上的x键时终止循环,则无法正常工作。 scanf实际上会失败,因为x不是%d的有效匹配序列。另一方面,如果您键入120 x的ASCII代码,您可能会很幸运并看到循环终止,因为未定义的行为可能包括重用value的相同位置在循环的每次迭代中。

要解决此问题,请在进行比较之前定义读取值,以查看它是否为x。此外,您必须使用,例如fgets()来阅读它,然后检查它是否x然后,如果不是,可以使用strtol()或{{1将它转换为数字。