自己模仿 NYOJ 35 表达式求值 写的,竟然AC了。。。
#include<stdio.h>
#include<stack>
#include<string.h>
#define A(x,y) (x+y) //取两数之和
#define B(x,y) (x>y?x:y)//取两数最大
#define C(x,y) (x<y?x:y)// 取两数最小
using namespace std;
int main()
{
int N;
scanf("%d",&N);
getchar();
while(N--)
{
stack<char> osta;
stack<int> dsta;
char s[310];
int i;
scanf("%s",s);
int len;
len=strlen(s);
char n1='A',n2='B',n3='C';
for(i=0;i<len;i++)
{
if(s[i]=='a'&&s[i+1]=='d'&&s[i+2]=='d')
osta.push(n1);
else if(s[i]=='m'&&s[i+1]=='a'&&s[i+2]=='x')
osta.push(n2);
else if(s[i]=='m'&&s[i+1]=='i'&&s[i+2]=='n')
osta.push(n3);
else if(s[i]=='(')
osta.push(s[i]);
else if(s[i]>='0'&&s[i]<='9')
{
int v=0;
while(s[i]>='0'&&s[i]<='9')
{
v=v*10+(s[i]-'0');
i++;
}
i--;
dsta.push(v);
}
else if(s[i]==',')
osta.push(s[i]);
else if(s[i]==')')
{
int a=dsta.top();dsta.pop();
int b=dsta.top();dsta.pop();
int c;
osta.pop();
osta.pop();
switch(osta.top())
{
case 'A':c=A(b,a);break;
case 'B':c=B(b,a);break;
case 'C':c=C(b,a);break;
}
dsta.push(c);
osta.pop();
}
}
printf("%d\n",dsta.top());
dsta.pop();
}
return 0;
}