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

表达式求值

时间限制: 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值