nyoj 35 表达式求值

来源:互联网 发布:java商品库存管理系统 编辑:程序博客网 时间:2024/06/06 06:39

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
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
来源
数据结构课本例题改进
上传者

张云聪

解题思路:http://blog.csdn.net/xunalove/article/details/70829879

代码:

#include<bits/stdc++.h>using namespace std;stack<char>f;//操作符栈stack<double>s;//操作数栈bool flag;int prior(char ch)//运算符的优先级{    switch(ch)    {    case'+':    case'-':        return 1;    case'*':    case'%':    case'/':        return 2;    default:        return 0;//括号    }}string trans(string a){    while(!f.empty())  f.pop();    f.push('#');    string ret="";//保存中缀表达式    int len=a.size(),i=0;    while(i<len)    {        if(a[i]==' '||a[i]=='=')//??        {            i++;            continue;        }        else if(a[i]=='(')            f.push(a[i++]);        else if(a[i]==')')        {            while(f.top()!='(')            {                ret+=f.top();                ret+=' ';                f.pop();            }            f.pop();//(出栈            i++;        }        else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%')        {            while(prior(f.top())>=prior(a[i]))//如果a[]的运算符的优先级小于等于栈顶元素的优先级,退栈运算符并放到后缀表达式中,直到a[i]的运算符优先级大于栈顶运算符的优先级            {                ret+=f.top();                ret+=' ';                f.pop();            }            f.push(a[i++]);        }        else        {            while((a[i]>='0'&&a[i]<='9')||a[i]=='.')            {                ret+=a[i++];            }            ret+=' ';        }    }    while(f.top()!='#')    {        ret+=f.top();        ret+=' ';        f.pop();    }    ret+='=';    return ret;}double cal(double a,double b,double ch)//计算{    if(ch=='+') return a+b;    if(ch=='-') return a-b;    if(ch=='*') return a*b;    if(ch=='%') return ((int)a%(int)b);    if(ch=='/')    {        if(b!=0)            return a/b;        flag=true;        return 0;    }}double solve(string a)//后缀表达式计算{    string t=trans(a);    while(!s.empty()) s.pop();    flag=false;    int len=t.length(),i=0;    while(i<len)    {        if(t[i]==' '||t[i]=='=')        {            i++;            continue;        }        else if(t[i]=='+'||t[i]=='-'||t[i]=='*'||t[i]=='/'||t[i]=='%')        {            double num1,num2;            num1=s.top();            s.pop();            num2=s.top();            s.pop();            s.push(cal(num2,num1,t[i]));            i++;        }        else        {            double x=0;            while(t[i]>='0'&&t[i]<='9')            {                x=x*10+t[i]-'0';                i++;            }            if(t[i]=='.')            {                double k=10.0,y=0;                i++;                while(t[i]>='0'&&t[i]<='9')                {                    y+=((t[i]-'0')/k);                    i++;                    k*=10;;                }                x+=y;            }            s.push(x);        }    }    return s.top();}string a;int main(){    int num;    scanf("%d",&num);    while(num--)    {        cin>>a;        //cout<<trans(a)<<endl;//将中缀表达式装换为后缀表达式        printf("%.2lf\n",solve(a));    }    return 0;}




0 0
原创粉丝点击