2018ICPC南京网络赛 B Call of Accepted 表达式求值

题目链接:https://nanti.jisuanke.com/t/31443

表达式求值,对于每一步运算要保存一个最大值一个最小值,处理出现负负为正的情况。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll Judge(char c1,char c2)
{
	ll a1,a2;
	if('+'==c1||'-'==c1) a1 = 3;
	if('*'==c1||'/'==c1)a1 = 5;
	if('d'==c1)a1=7;
	if('('==c1) a1 = 1;
	if(')'==c1) a1 = 9;
	if('#'==c1) a1 = 0;

	if('+'==c2||'-'==c2)a2 = 2;
	if('*'==c2||'/'==c2)a2 = 4;
	if('d'==c2)a2=6;
	if('('==c2) a2 = 8;
	if(')'==c2) a2 = 1;
	if('#'==c2) a2 = 0;
	if(a1>a2) return 1;
	if(a1==a2) return 0;
	if(a1<a2) return -1;
}
ll runmin(char c,ll d1,ll d2)
{
	switch (c)
	{
	case '+':
		return d1+d2;
		break;
	case '-':
		return d1-d2;
		break;
	case'*' :
		return d1*d2;
		break;
	case '/':
		return d1/d2;
		break;
	case 'd':
		return d1;
		break;
	default:
		return 0.0;
		break;
	}
}

ll runmax(char c,ll d1,ll d2)
{
	switch (c)
	{
	case '+':
		return d1+d2;
		break;
	case '-':
		return d1-d2;
		break;
	case'*' :
		return d1*d2;
		break;
	case '/':
		return d1/d2;
		break;
	case 'd':
		return d1*d2;
		break;
	default:
		return 0.0;
		break;
	}
}
struct Node
{
	ll l,r;
};
int main()
{
	string str;
	char * op="+-*d()#";
	while(cin>>str)
	{
		string str1=str;
		str.append(1,'#');
		str1.append(1,'#');
		stack<char> OPTR;
		stack<char> OPTR1;
		stack<Node> OPND1;
		int a = -1;
		OPTR.push('#');
		while(true)
		{
		 int b = a+1;
		 a = str.find_first_of(op,a+1);
		 if(a==string::npos) break;
		 if(a!=b)
		 {
		 string ss(str,b,a-b);
		 ll d=atof(ss.c_str());
		 Node D;
		 D.l=d;
		 D.r=d; 
		 OPND1.push(D);
		 }
		 int ju = Judge(OPTR.top(),str[a]);
		 if(-1==ju)
		 {
		     OPTR.push(str[a]);
		 }
		 if(0==ju)
		 {
			 OPTR.pop();
		 }
		 if(1==ju)
		 {
			 Node d1 = OPND1.top();
			 OPND1.pop();
			 Node d2 = OPND1.top();
			 OPND1.pop();
			 ll D1 = runmin(OPTR.top(),d2.l,d1.l);
			 ll D2 = runmax(OPTR.top(),d2.l,d1.l);
			 ll D3 = runmin(OPTR.top(),d2.l,d1.r);
			 ll D4 = runmax(OPTR.top(),d2.l,d1.r);
			 ll D5 = runmin(OPTR.top(),d2.r,d1.l);
			 ll D6 = runmax(OPTR.top(),d2.r,d1.l);
			 ll D7 = runmin(OPTR.top(),d2.r,d1.r);
			 ll D8 = runmax(OPTR.top(),d2.r,d1.r);
			 d1.l=min(D1,min(D2,min(D3,min(D4,min(D5,min(D6,min(D7,D8)))))));
			 d1.r=max(D1,max(D2,max(D3,max(D4,max(D5,max(D6,max(D7,D8)))))));
			 OPND1.push(d1);
			 OPTR.pop();
			 a--;
		 }
		}
	Node ans=OPND1.top();
	cout<<ans.l<<" "<<ans.r<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值