
数据结构C语言版,为什么这个程序运行起来乱七八糟 在该输入的时候为什么跳过?大家帮我运行分析一下下
#include<stdio.h>#include<malloc.h>#include<string.h>#defineCSFPL100#defineCCZL10type...
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define CSFPL 100
#define CCZL 10
typedef struct{
char *base; /*定义栈*/
char *top;
int size;
}SXZ;
SXZ S;
SXZ InitStack(void)
{
S.base=(char*)malloc(CSFPL * sizeof(char)); /*初始化栈*/
S.top=S.base;
S.size=CSFPL;
}
SXZ Push(char e)
{ /*插入e为新的栈顶元素*/
if(S.top-S.base>=S.size)
{
S.base=(char*)realloc(S.base,(S.size+CCZL)*sizeof(char));
S.top=S.base+S.size;
S.size+=CCZL;
}
e=*(S.top-1);
}
SXZ Pop(char e)
{
if(S.top==S.base)
printf("错误"); /*删除栈顶并反回其值*/
e=*--S.top;
}
void main()
{
int a;
do
{
printf("\n\t\t\t欢迎使用本系统,栈的使用,请按要求操作\n\t\t\t1,初始化栈\n\t\t\t2,插入新的栈顶元素\n\t\t\t3,删除栈顶元素\n\t\t\t4,退出\n");
scanf("%d",&a);
switch(a)
{
case 1:{
InitStack();
}break;
case 2:{
char e;
printf("请输入要插入的字符元素\n");
scanf("%c",&e);
Push(e);
printf("插入成功\n");
}break;
case 3:{
int b;
Pop(b);
printf("栈顶已经删除,删除的元素为%c",b);
}break;
case 4:{
a=0;
printf("欢迎使用,现在要退出系统\n");
}break;
default: printf("输入错误,请重新输入\n");
}
}while(a);
} 展开
#include<malloc.h>
#include<string.h>
#define CSFPL 100
#define CCZL 10
typedef struct{
char *base; /*定义栈*/
char *top;
int size;
}SXZ;
SXZ S;
SXZ InitStack(void)
{
S.base=(char*)malloc(CSFPL * sizeof(char)); /*初始化栈*/
S.top=S.base;
S.size=CSFPL;
}
SXZ Push(char e)
{ /*插入e为新的栈顶元素*/
if(S.top-S.base>=S.size)
{
S.base=(char*)realloc(S.base,(S.size+CCZL)*sizeof(char));
S.top=S.base+S.size;
S.size+=CCZL;
}
e=*(S.top-1);
}
SXZ Pop(char e)
{
if(S.top==S.base)
printf("错误"); /*删除栈顶并反回其值*/
e=*--S.top;
}
void main()
{
int a;
do
{
printf("\n\t\t\t欢迎使用本系统,栈的使用,请按要求操作\n\t\t\t1,初始化栈\n\t\t\t2,插入新的栈顶元素\n\t\t\t3,删除栈顶元素\n\t\t\t4,退出\n");
scanf("%d",&a);
switch(a)
{
case 1:{
InitStack();
}break;
case 2:{
char e;
printf("请输入要插入的字符元素\n");
scanf("%c",&e);
Push(e);
printf("插入成功\n");
}break;
case 3:{
int b;
Pop(b);
printf("栈顶已经删除,删除的元素为%c",b);
}break;
case 4:{
a=0;
printf("欢迎使用,现在要退出系统\n");
}break;
default: printf("输入错误,请重新输入\n");
}
}while(a);
} 展开
3个回答
展开全部
//不明白你写的意思,给你改了一个,可以试试
#include <stdio.h>
#include <stdlib.h>
#define CSFPL 100
typedef struct
{
char base; /*定义栈*/
char top;
char stack[CSFPL];//栈区
int size;
}SXZ;
SXZ S;
void InitStack(void)
{ /*初始化栈*/
S.top = S.base = 0;
S.size = CSFPL;
}
int Push(char e)
{ /*插入e为新的栈顶元素*/
if (S.top - S.base >= S.size)
{
printf("栈满!\n\n\n");
return 0;
}
S.stack[S.top++] = e;
return 1;
}
int Pop(char *e)
{
if (S.top == S.base)
{
printf("栈空!\n\n\n");
return 0;
}/*删除栈顶并反回其值*/
*e = S.stack[--S.top];
return 1;
}
void menu(void)
{
printf("\n\t\t\t欢迎使用本系统,栈的使用,请按要求操作\n\t\t\t1,初始化栈\n\t\t\t2,插入新的栈顶元素\n\t\t\t3,删除栈顶元素\n\t\t\t4,退出\n");
}
void main(void)
{
int a;
do
{
menu();
scanf("%d",&a);
switch(a)
{
case 1:{
system("cls");
InitStack();
printf("栈区已初始化!\n\n\n");
system("pause");
system("cls");
}break;
case 2:{
char e;
system("cls");//清屏
printf("请输入要插入的字符元素\n");
fflush(stdin);//清除缓冲区,即‘回车键’
scanf("%c",&e);
if (1 == Push(e))
{
printf("插入成功\n\n\n");
}
system("pause");//按任意键继续...
system("cls");
}break;
case 3:{
char b;
system("cls");
if (1 == Pop(&b))
{
printf("栈顶已经删除,删除的元素为%c\n\n\n",b);
}
system("pause");
system("cls");
}break;
case 4:{
system("cls");
a=0;
printf("欢迎使用,现在要退出系统\n");
}break;
default: printf("输入错误,请重新输入\n");
}
}while(a);
}
#include <stdio.h>
#include <stdlib.h>
#define CSFPL 100
typedef struct
{
char base; /*定义栈*/
char top;
char stack[CSFPL];//栈区
int size;
}SXZ;
SXZ S;
void InitStack(void)
{ /*初始化栈*/
S.top = S.base = 0;
S.size = CSFPL;
}
int Push(char e)
{ /*插入e为新的栈顶元素*/
if (S.top - S.base >= S.size)
{
printf("栈满!\n\n\n");
return 0;
}
S.stack[S.top++] = e;
return 1;
}
int Pop(char *e)
{
if (S.top == S.base)
{
printf("栈空!\n\n\n");
return 0;
}/*删除栈顶并反回其值*/
*e = S.stack[--S.top];
return 1;
}
void menu(void)
{
printf("\n\t\t\t欢迎使用本系统,栈的使用,请按要求操作\n\t\t\t1,初始化栈\n\t\t\t2,插入新的栈顶元素\n\t\t\t3,删除栈顶元素\n\t\t\t4,退出\n");
}
void main(void)
{
int a;
do
{
menu();
scanf("%d",&a);
switch(a)
{
case 1:{
system("cls");
InitStack();
printf("栈区已初始化!\n\n\n");
system("pause");
system("cls");
}break;
case 2:{
char e;
system("cls");//清屏
printf("请输入要插入的字符元素\n");
fflush(stdin);//清除缓冲区,即‘回车键’
scanf("%c",&e);
if (1 == Push(e))
{
printf("插入成功\n\n\n");
}
system("pause");//按任意键继续...
system("cls");
}break;
case 3:{
char b;
system("cls");
if (1 == Pop(&b))
{
printf("栈顶已经删除,删除的元素为%c\n\n\n",b);
}
system("pause");
system("cls");
}break;
case 4:{
system("cls");
a=0;
printf("欢迎使用,现在要退出系统\n");
}break;
default: printf("输入错误,请重新输入\n");
}
}while(a);
}
追问
太感谢了 能加个QQ以后多交流一下吗? 我才学的C
追答
fflush(stdin);就是用用清除缓冲区,在这里清除缓冲区的'回车键'
再说你写的确实有一些错误
1 2 1 5 9 0 6 8 0

2025-09-24 广告
URule Pro Java 规则引擎,一款给业务人员使用的可视化商业决策规则引擎系统,打开浏览器即可开始设计业务规则;URule Pro是一款自主研发纯Java规则引擎,亦是一款国产智能风控决策引擎,可以运行在Windows、Linux、...
点击进入详情页
本回答由锐道提供
展开全部
LZ,你懂不懂C?
如果是对上面程序有意见,当我白说.
如果是想弄明白怎么回事,往下看.
你用的编译系统是什么?估计是TC吧,这程序是VC++的C版的.
SXZ InitStack(void)
{
S.base=(char*)malloc(CSFPL * sizeof(char)); /*初始化栈*/
S.top=S.base;
S.size=CSFPL;
}
这种malloc用法根本不对,在C中,struct中不会动态分配内存的.
代码别的问题根本没有.
如果是对上面程序有意见,当我白说.
如果是想弄明白怎么回事,往下看.
你用的编译系统是什么?估计是TC吧,这程序是VC++的C版的.
SXZ InitStack(void)
{
S.base=(char*)malloc(CSFPL * sizeof(char)); /*初始化栈*/
S.top=S.base;
S.size=CSFPL;
}
这种malloc用法根本不对,在C中,struct中不会动态分配内存的.
代码别的问题根本没有.
追问
我是按数据结构这本书里面的伪代码写的 !里面是这样写的 我不知道自己有木有弄错! 不过书里面只是提供了初始化栈的算法 主函数什么都是我自己弄的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看到有字符输入语句,基本上可以猜出楼主在输入字符时,每输入一个字符就按了一次回车。
要知道,回车实际上是输入了两个字符,而且后一个字符会留在输入缓冲区内,会下一个字符输入语句给读到。
正确的方法:一是一次性输入全部要输入的字符,再回车。二是每次输入字符前,调用清空输入缓冲区的语句。三是如果你每次输入字符后都要按回车,可以在输入字符前,调用一次getchar()
要知道,回车实际上是输入了两个字符,而且后一个字符会留在输入缓冲区内,会下一个字符输入语句给读到。
正确的方法:一是一次性输入全部要输入的字符,再回车。二是每次输入字符前,调用清空输入缓冲区的语句。三是如果你每次输入字符后都要按回车,可以在输入字符前,调用一次getchar()
追问
虽然说楼下的程序都帮我弄好了 但是你才是说出了我错误的原因!谢谢啊!纠结着采纳谁呢?可惜你没有帮我编个,不然就给你了!我想想!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询