您的位置:首页 > 其它

NYOJ35表达式求值

2017-08-24 09:54 399 查看


表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4

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

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

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

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

数据保证除数不会为0
输出每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
1.50
4.00




#include<iostream>
#include<stack>
#include<stdlib.h>
#include<iomanip>
using namespace std;
int cmp(char a)
{
if(a=='+'||a=='-')
return 1;
if(a=='*'||a=='/')
return 2;
return 0;//当a为'='返回1
}
void comput(stack<double>&mp,stack<char>&op)
{
double b=mp.top();
mp.pop();
double a=mp.top();
mp.pop();
switch(op.top())
{
case '+':mp.push(a+b);break;
case '-':mp.push(a-b);break;
case '*':mp.push(a*b);break;
case '/':mp.push(a/b);break;
}
op.pop();//为了消去运算符
}
int main()
{
int n,t;
cin>>n;
stack<double>mp;
stack<char>op;
while(n--)
{
string str;
// stack<double>mp;
// stack<char>op;
cin>>str;
t=str.size();
for(int i=0;i<t;i++)
{
if(isdigit(str[i]))
{
double m=atof(&str[i]);
while(i<t&&(isdigit(str[i])||str[i]=='.'))
i++;
i--;
mp.push(m);
}
else
if(str[i]=='(')
op.push(str[i]);
else
{
if(str[i]==')')
{
while(op.top()!='(')
comput(mp,op);
op.pop();//为了消去'('
}
else
if(op.empty()||cmp(str[i])>cmp(op.top()))
op.push(str[i]);
else
{
while(!op.empty()&&cmp(str[i])<=cmp(op.top()))
comput(mp,op);
op.push(str[i]);//向栈中存入元素,但最后不要忘记消除
//以免影响下一组测试数据
}
}
}
//cout<<op.top()<<endl;
op.pop();//将栈中的元素消去,这个元素应该是'='
cout<<fixed<<setprecision(2)<<mp.top()<<endl;
mp.pop();
}
}

#include<iostream>
#include<stack>
#include<stdlib.h>
#include<iomanip>
using namespace std;
int cmp(char a)
{
if(a=='+'||a=='-')
return 1;
i
b904
f(a=='*'||a=='/')
return 2;
return 0;//当a为'='返回1
}
void comput(stack<double>&mp,stack<char>&op)
{
double b=mp.top();
mp.pop();
double a=mp.top();
mp.pop();
switch(op.top())
{
case '+':mp.push(a+b);break;
case '-':mp.push(a-b);break;
case '*':mp.push(a*b);break;
case '/':mp.push(a/b);break;
}
op.pop();//为了消去运算符
}
int main()
{
int n,t;
cin>>n;
stack<double>mp;
stack<char>op;
while(n--)
{
stack<double>mp;
stack<char>op;//输入每组测试数据之前都重新定义栈
string str;
cin>>str;
t=str.size();
for(int i=0;i<t;i++)
{
if(isdigit(str[i]))
{
double m=atof(&str[i]);
while(i<t&&(isdigit(str[i])||str[i]=='.'))
i++;
i--;
mp.push(m);
}
else
if(str[i]=='(')
op.push(str[i]);
else
{
if(str[i]==')')
{
while(op.top()!='(')
comput(mp,op);
op.pop();//为了消去'('
}
else
if(op.empty()||cmp(str[i])>cmp(op.top()))
op.push(str[i]);
else
{
while(!op.empty()&&cmp(str[i])<=cmp(op.top()))
comput(mp,op);
op.push(str[i]);
}
}
}
//cout<<op.top()<<endl;
//op.pop();//因为你在每组测试数据之前都重新定义了栈
//因此即便栈中的元素没有被清空也不会影响下一组数据
//因为你在下一组测试数据时使用了一个重新定义的新栈
cout<<fixed<<setprecision(2)<<mp.top()<<endl;
mp.pop();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: