利用表达式原转后缀、后缀求值算法编写计算器程序。
要求:允许用户输入表达式,然后计算并输出结果。
表达式中有加减乘除运算符、括号。
操作数可为浮点型
求大佬帮我看看哪里出问题了
#include<stdlib.h>
#include<string.h>
typedef struct snode
{
char data;
struct snode *next;
}Snode,*LinkStack;
typedef struct std
{
float data;
struct std *nexts;
}STD,*ST;
void InitStack(LinkStack *LS);
int Push(LinkStack *LS,char e);
int Pop(LinkStack *LS);
void InitStack1(ST *Ls);
void Pushs(ST *s,float e);
float Pops(ST *Ls);
void Transformation(char a[100],char suff[100]);
int prior(char a);
int isdigit(char e);
int GetTop(LinkStack s);
int Calculate(char b[100]);
void main()
{
char a[100],suff[100];
printf("请输入多项式(输入英文括号):");
gets(a);
Transformation(a,suff);
printf("原表达式转后缀式为(以#结尾):");
puts(suff);
Calculate(suff);
}
void InitStack(LinkStack *LS)
{
*LS=NULL;
}
void InitStack1(ST *Ls)
{
*Ls=NULL;
}
int Push(LinkStack *LS,char e)
{
LinkStack p=(LinkStack)malloc(sizeof(snode));
p->data=e;
p->next=*LS;
*LS=p;
return 1;
}
void Pushs(ST *s,float e)
{
ST p=(ST)malloc(sizeof(STD));
p->data=e;
p->nexts=*s;
*s=p;
}
int Pop(LinkStack *LS)
{
char e;
LinkStack p=*LS;
if(*LS==NULL) return 0;
*LS=(*LS)->next;
e=p->data;
free(p);
return e;
}
float Pops(ST *Ls)
{
float i;
ST p=*Ls;
if(*Ls==NULL)return 0;
*Ls=(*Ls)->nexts;
i=p->data;
free(p);
return i;
}
int prior(char a)
{
if(a=='*'||a=='/') return 4;
else if(a=='+'||a=='-') return 3;
else if(a=='(') return 2;
else if(a=='#') return 1;
else return 0;
}
int GetTop(LinkStack s)
{
char e;
if(s==NULL) return 0;
e=s->data;
return e;
}
int isdigit(char e)
{
if(e>='0'&&e<='9') return 1;
if(e=='.') return 1;
return 0;
}
void Transformation(char a[100],char suff[100])
{ int i=0,j=0,length=0;
char ch;
LinkStack s;
InitStack(&s);
Push(&s,'#');
length=strlen(a);
a[length]='#';
a[length+1]='\0';
while(a[i]!='\0')
{
if(isdigit(a[i])) suff[j++]=a[i];
else
{
switch(a[i])
{
case'(':Push(&s,a[i]);break;
case')':ch=Pop(&s);
while(ch!='(')
{suff[j++]=ch;
ch=Pop(&s);
}
break;
default:
ch=GetTop(s);
while(prior(ch)>=prior(a[i]))
{
suff[j++]=ch;
ch=Pop(&s);
ch=GetTop(s);
}
if(a[i]!='#')Push(&s,a[i]);
}
suff[j++]=32;
}
i++;
}
suff[j]='\0';
}
int Calculate(char b[100])
{
ST s;
float v=0,a=0;
int i=0;
float j=0,x1=0,x2=0;
InitStack1(&s);
while(b[i]!='#')
{
switch(b[i])
{
case' ':break;
case'+':x2=Pops(&s);
x1=Pops(&s);
Pushs(&s,x1+x2);
break;
case'-':x2=Pops(&s);
x1=Pops(&s);
Pushs(&s,x1-x2);
break;
case'*':x2=Pops(&s);
x1=Pops(&s);
Pushs(&s,x1*x2);
break;
case'/':x2=Pops(&s);
x1=Pops(&s);
if(x2!=0) Pushs(&s,x1-x2);
else
{
printf("错误,分母为0。\n");
return 0;}
break;
default:if(b[i]<='9'&&b[i]>='0')
{
v=0;
v=b[i]-48;
i++;
while(b[i]<='9'&&b[i]>='0')
{
v=v*10+(b[i]-48);
i++;
}
if(b[i]=='.')
{
i++;
j=0.1;
while(b[i]<='9'&&b[i]>='0')
{
a=a+j*(b[i]-48);
j=j*j;
i++;
}
}
}
v=v+a;
Pushs(&s,v);
break;
}
i++;
}
printf("结果(保留两位小数)=%.2f\n",Pops(&s));
return 1;
}