您的位置:首页 > 其它

nyoj 1272 表达式求值--河南省第九届省赛A题

2016-06-11 21:11 573 查看


表达式求值

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