nyist 35 表达式求值

来源:互联网 发布:网络热点事件2017 编辑:程序博客网 时间:2024/04/30 11:26
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
21.000+2/4=((1+2)*5+1)/4=
样例输出
1.504.00
#include<bits/stdc++.h>#include<stack>const int MAX=10005;using namespace std;char pp[MAX];//存储转换后的后缀表达式void trans(char *str)//将中缀表达式转换后缀表达式{    stack<char>ss;    int i,j;    i=0;    j=0;    while(str[i]!='=')    {        if(str[i]=='(')        {            ss.push(str[i]);        }        else if(str[i]==')')        {            while(ss.top()!='(')            {                pp[j++]=ss.top();                ss.pop();            }            ss.pop();        }        else if(str[i]=='+'||str[i]=='-')        {            while(!ss.empty()&&ss.top()!='(')            {                pp[j++]=ss.top();                ss.pop();            }            ss.push(str[i]);        }        else if(str[i]=='*'||str[i]=='/')        {            while((!ss.empty()&&ss.top()=='*')||(!ss.empty()&&ss.top()=='/'))            {                pp[j++]=ss.top();                ss.pop();            }            ss.push(str[i]);        }        else if(str[i]==' ')        {            i++;            continue;        }        else        {            while((str[i]>='0'&&str[i]<='9')||str[i]=='.')            {                pp[j++]=str[i];                i++;            }            i--;            pp[j++]='=';        }        i++;    }    while(!ss.empty())    {        pp[j++]=ss.top();        ss.pop();    }    pp[j]='=';//    for(int k=0; k<=j; k++)//输出转化后的后缀表达式//    {//        printf("%c",pp[k]);//    }//    printf("\n");}void compvalue()//计算后缀表达式的值{    double d,d1;    stack<double>mm;    int i;    i=0;    while(pp[i]!='=')    {        if(pp[i]=='+')        {            double r=mm.top();            mm.pop();            double l=mm.top();            mm.pop();            double result=l+r;            mm.push(result);        }        else if(pp[i]=='-')        {            double r=mm.top();            mm.pop();            double l=mm.top();            mm.pop();            double result=l-r;            mm.push(result);        }        else if(pp[i]=='*')        {            double r=mm.top();            mm.pop();            double l=mm.top();            mm.pop();            double result=l*r;            mm.push(result);        }        else if(pp[i]=='/')        {            double r=mm.top();            mm.pop();            double l=mm.top();            mm.pop();            double result=l/r;            mm.push(result);        }        else        {            d=0;            d1=0;            while(pp[i]>='0'&&pp[i]<='9')            {                d=10*d+pp[i]-'0';                i++;            }            if(pp[i]=='.')            {                i++;                double f=0;                while(pp[i]>='0'&&pp[i]<='9')                {                    f=f+1;                    d1+=(pp[i]-'0')*(double)(1/(pow(10,f)));                    i++;                }            }            d=d+d1;            mm.push(d);        }        i++;    }    printf("%.2lf\n",mm.top());}int main(){    char str[MAX];    int n;    scanf("%d\n",&n);    while(n--)    {        gets(str);        trans(str);        compvalue();    }    return 0;}


0 0