作业帮 > 综合 > 作业

利用栈把表达式的中缀表示转换成后缀表示C++

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/03 00:48:07
利用栈把表达式的中缀表示转换成后缀表示C++
利用栈把表达式的中缀表示转换成后缀表示(逆波兰)
表达式的表示:
中缀:a+b/c-d ==》 后缀:abc/+d-
中缀:a+b/c-d*(e+f*g) ==》后缀:abc/+defg*+*-
#include
struct
{
int op;
double num;
}ret[200];
int topa,topb;
int opstk[200];
int level[200];
double cal(double a,double b,char op)
{
if(op=='+')
return a+b;
if(op=='-')
return a-b;
if(op=='*')
return a*b;
if(op=='/')
return a/b;
}
int main()
{
int i,temp,sign,j,x,y;
char s[200];
level['+']=level['-']=0;
level['*']=level['/']=1;
level['(']=level[')']=2;
while(scanf("%s",s)!=EOF)
{
topa=topb=0;
for(i=0;s[i];i++)
{
if(s[i]=='(')
{
opstk[topa++]='(';
}
else if(s[i]==')')
{
while(topa>0&&opstk[topa-1]!='(')
{
topa--;
ret[topb++].op=opstk[topa];
}
topa--;
}
else if(s[i]=='+'||s[i]=='*'||s[i]=='/')
{
while(topa>0&&opstk[topa-1]!='('&&level[opstk[topa-1]]>=level[s[i]])
{
topa--;
ret[topb++].op=opstk[topa];
}
opstk[topa++]=s[i];
}
else if(s[i]=='-')
{
if((i>0&&s[i-1]=='(')||i==0)
{
sign=-1;
temp=0;
for(j=i+1;s[j]&&s[j]>='0'&&s[j]0&&opstk[topa-1]!='('&&level[opstk[topa-1]]>=level['-'])
{
topa--;
ret[topb++].op=opstk[topa];
}
opstk[topa++]='-';
}
}
else if(s[i]>='0'&&s[i]='0'&&s[j]0)
{
topa--;
ret[topb++].op=opstk[topa];
}
for(i=0;i=0;y--)
if(ret[y].op==-1)
break;
for(x=y-1;x>=0;x--)
if(ret[x].op==-1)
break;
ret[i].num=cal(ret[x].num,ret[y].num,ret[i].op);
ret[i].op=-1;
ret[x].op=0;
ret[y].op=0;
}
}
printf("%.4lf\n",ret[topb-1].num);
}
return 0;
}