将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/