中缀表达式转化为后缀表达式

xinye1230 2016-10-12 02:15:33
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;


int InitStack(SqStack *s)
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s->base)
exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack *s,ElemType e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
exit(0);

}
*(s->top)=e;
s->top++;
return OK;
}
int Pop(SqStack *s,ElemType *e)
{
if(s->top==s->base)
{
return ERROR;
}
*e=*--(s->base);
return OK;
}
int Stacklen(SqStack s)
{
return (s.top-s.base);
}
int InitStack(SqStack *s);
int Push(SqStack *s,ElemType e);
int Pop(SqStack *s,ElemType *e);
int StackLen(SqStack s);
int main()
{
SqStack s;
char c,e;
InitStack(&s);
printf("请输入中缀表达式\n");
scanf("%c",&c);
while(c!='#')
{
while(c>='0'&&c<='9')
{
printf("%c",c);
scanf("%c",&c);
if(c<'0'||c>'9')
{
printf(" ");
}
}
if(')'==c)
{
Pop(&s,&e);
while('('!=e)
{
printf("%c",e);
Pop(&s,&e);
}
}
else if('+'==c||'-'==c)
{
if(!Stacklen(s))
{
Push(&s,c);
}
else
{
do
{
Pop(&s,&e);
if('('==e)
{
Push(&s,e);
}
else
{
printf("%c",e);
}
}while(Stacklen(s)&&'('!=e);
Push(&s,c);
}
}
else if('*'==c||'/'==c||'('==c)
{
Push(&s,c);
}
else if('#'==c)
{
break;
}
else
{
printf("用户输入失败\n");
return ERROR;
}
scanf("%c",&c);
}
while(Stacklen(s))
{
Pop(&s,&e);
printf("%c",e);
}
return 0;
}

这段程序哪里出错了,调试没有错,为什么运行的时候会出来一大堆警告呢?
...全文
174 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-13
  • 打赏
  • 举报
回复
引用 3 楼 xinye1230 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
这是什么啊??[/quote] 你错误地使用了scanf("%c",&c);
赵4老师 2016-10-13
  • 打赏
  • 举报
回复
天下难事必做于易,天下大事必做于细。
xinye1230 2016-10-13
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 3 楼 xinye1230 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
这是什么啊??[/quote] 你错误地使用了scanf("%c",&c);[/quote] 嗯,好的,谢谢,你提醒的对,我找到错误了。我把出栈时返回的值写错了,应该是*e=*--(s->top)而我写成了*--(s->base).
xinye1230 2016-10-12
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
Push函数中,如果relloc后,s->top可能已经失效,s->stacksize也会发生变化
我没有看懂你说的,什么意思啊?
xinye1230 2016-10-12
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
这是什么啊??
paschen 2016-10-12
  • 打赏
  • 举报
回复
Push函数中,如果relloc后,s->top可能已经失效,s->stacksize也会发生变化
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧