C 使用数组创建堆栈
我正试图通过使用数组来编写创建堆栈的代码,有人建议我使用动态内存分配。问题在于,它没有“扫描”决定是否应该退出循环的响应C 使用数组创建堆栈,c,arrays,stack,C,Arrays,Stack,我正试图通过使用数组来编写创建堆栈的代码,有人建议我使用动态内存分配。问题在于,它没有“扫描”决定是否应该退出循环的响应 #include<stdio.h> static int top, size, *a, x; stfull(){ if(top<size) x = 0; else x = 1; } stempty(){ if(!top) x = 1; else x = 0; } push(int z){ if(x){
#include<stdio.h>
static int top, size, *a, x;
stfull(){
if(top<size) x = 0;
else x = 1;
}
stempty(){
if(!top) x = 1;
else x = 0;
}
push(int z){
if(x){
printf("stack full\tstack overflow\n");
return;
}
else{
a[top] = z;
top++;
return;
}
}
pop(){
if(x){
printf("empty stack\tstack underflow\n");
return;
}
else{
printf("%d ", a[top]);
top--;
return;
}
}
main(){
int num, res;
char ans = 'y';
printf("array size:\t");
scanf("%d", &size);
a = malloc(size*sizeof(int));
printf("choose number for result\n1. push elements\n2.display elements\n3.exit\n");
scanf("%d", &res);
switch(res){
case 1:
while(ans == 'y'){
printf("enter a number\t");
scanf("%d", &num);
push(num);
printf("enter more?\t");
ans = getchar();
}
break;
case 2:
do{
pop();
printf("pop more?\t");
ans = getchar();
}while(ans == 'y');
break;
case 3:
exit(1);
}
}
#包括
静态int-top,大小*a,x;
stfull(){
如果(top您的代码退出,因为getchar()读取\n按下的[enter]作为ans的字符。
你的意见是
enter a number 3[enter]
所以
读取[enter]。因此,一个简单的解决方案是将getchar()用作
您的代码将继续工作您可以添加此行
fseek(stdin,0,SEEK_END);
在每个getchar之前,当您希望确保它不读取任何前面的字符时。它基本上会清除缓冲区,或者更准确地说,会将读取点移动到缓冲区的末尾。malloc()
仅用于在运行时分配内存。静态变量在编译时初始化。因此,您应该使用if(!a)a=malloc(size*sizeof(int));
creatin',usin',takin',scannin:“g”有什么问题吗在你的键盘上?别忘了,当你请求一个字符时,缓冲区中会留下一个换行符,这基本上会跳过一些getchar语句。有趣的是,我以前(在解析器生成器中)见过这个“void
作为隐式返回类型”但是我认为默认的隐式返回类型是int
。在ANSI-C之前的某个时候它是否曾经void
?您的x
变量看起来很乱,您是否将其用作全局返回值?可怕的是..调用是可移植的。但是,您想要的效果可能不是。fseek()有太多的警告(在ISO标准中),当您添加各种操作系统,或者从文件或管道重定向stdin时,我怀疑您在所有情况下都不会得到想要的。
getchar();
ans=getchar();
fseek(stdin,0,SEEK_END);