您的位置:首页 > 其它

nyist 35 表达式求值

2016-10-06 13:28 253 查看
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。

比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)

输入第一行输入一个整数n,共有n组测试数据(n<10)。

每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。

数据保证除数不会为0
输出每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=


样例输出
1.50
4.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: