表达式求值
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式。 2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+. 3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 值的各位数字之和,再从中选最大数。 4.如果 X 是 表达式,则 (X)也是表达式。 例如: 表达式 12*(2+3)+Smax(333,220+280) 的值为 69。 请你编程,对给定的表达式,输出其值。
-
输入
- 【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000 输出
- 【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。 样例输入
-
3 12+2*3 12*(2+3) 12*(2+3)+Smax(333,220+280)
样例输出
-
18 60 69
来源
- 河南省第九届省赛 上传者
- onlinejudge
两个小时-.-终于模出来了-.-省赛时爆零都是我的错
代码:
#include<cstdio>
#include<stack>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[1010];
int chang,i,a,b;
char lp;
int hao();
int sm();
int sh();
int sm()
{
int a,b;
i+=4;
a=hao();
// printf("guo\n");
b=hao();
int kkp=0,kkpp=0;
// printf("%d %d\n",a,b);
while (a)
{
kkp+=a%10;
a/=10;
}
while (b)
{
kkpp+=b%10;
b/=10;
}
a=max(kkp,kkpp);
// printf("******* %d\n",a);
return a;
}
int hao()
{
int a,b;
stack<char> fu;
stack<char> hfu;
stack<int> shu;
stack<int> hshu;
i++;int kkp=0;
for (;ch[i]!=')'&&ch[i]!=',';i++)
{
// printf("%d --%c-- 66\n",i,ch[i]);
if (ch[i]=='S')
shu.push(sm());
else 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);
}
//i++;
a=hshu.top();
// printf("%d 000000\n",a);
return a;
}
int sh()
{
int kkp=0;
for (;ch[i]<='9'&&ch[i]>='0';i++)
kkp=kkp*10+ch[i]-'0';
i--;
return kkp;
}
int suan()
{
int a,b;
stack<char> fu;
stack<int> shu;
stack<char> hfu;
stack<int> hshu;
chang=strlen(ch);
for (i=0;i<chang;i++)
{
// printf("%d ==%c== 66\n",i,ch[i]);
if (ch[i]=='S')
shu.push(sm());
else 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();
// printf("%d 000000\n",a);
return a;
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
scanf("%s",ch);
int s=suan();
printf("%d\n",s);
}
return 0;
}