您的位置:首页 > 其它

nyoj 35 表达式求值<模拟+栈>

2016-06-16 21:32 495 查看


表达式求值

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

描述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<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[1010];
int chang,i,a,b;
char lp;
double hao();
double sh();
double hao()
{
double a,b;
stack<char> fu;
stack<char> hfu;
stack<double> shu;
stack<double> hshu;
i++;int kkp=0;
for (;ch[i]!=')';i++)
{
if (ch[i]=='(')
shu.push(hao());
else if (ch[i]>='0'&&ch[i]<='9')
shu.push(sh());
else if (fu.empty())
fu.push(ch[i]);
else
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
fu.push(ch[i]);
}
}
if (!fu.empty())
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
}
while (!fu.empty())
{
lp=fu.top();
fu.pop();
hfu.push(lp);
}
while (!shu.empty())
{
a=shu.top();
shu.pop();
hshu.push(a);
}
while (!hfu.empty())
{
lp=hfu.top();
hfu.pop();
a=hshu.top();
hshu.pop();
b=hshu.top();
hshu.pop();
if (lp=='+')
a+=b;
else
a-=b;
hshu.push(a);
}
a=hshu.top();
return a;
}
double sh()//注意小数。。
{
double kkp=0,kp=-1.0;int k=0;
for (;(ch[i]<='9'&&ch[i]>='0')||ch[i]=='.';i++)
{
if (ch[i]=='.')
k=1;
else
{
if (!k)
kkp=kkp*10+ch[i]-'0';
else
{
kkp=kkp+double(ch[i]-'0')*pow(10.0,kp);
kp--;
}
}
}
i--;
return kkp;

}
double suan()
{
double a,b;
stack<char> fu;
stack<double> shu;
stack<char> hfu;
stack<double> hshu;
chang=strlen(ch);chang--;
for (i=0;i<chang;i++)
{
if (ch[i]=='(')
shu.push(hao());
else if (ch[i]>='0'&&ch[i]<='9')
shu.push(sh());
else if (fu.empty())
fu.push(ch[i]);
else
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
fu.push(ch[i]);
}
}
if (!fu.empty())
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
}
while (!fu.empty())
{
lp=fu.top();
fu.pop();
hfu.push(lp);
}
while (!shu.empty())
{
a=shu.top();
shu.pop();
hshu.push(a);
}
while (!hfu.empty())
{
lp=hfu.top();
hfu.pop();
a=hshu.top();
hshu.pop();
b=hshu.top();
hshu.pop();
if (lp=='+')
a+=b;
else
a-=b;
hshu.push(a);
}
a=hshu.top();
return a;
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
scanf("%s",ch);
double s=suan();
printf("%.2lf\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: