题目链接: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;
}