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

1个回答

  • #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("%.4lfn",ret[topb-1].num);

    }

    return 0;

    }