1 模拟法:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define N 10000
using namespace std;
int st[N];
char sc[N],s[N];
int add(int a,int b){return a+b;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int main()
{
//freopen("biao.txt","r",stdin);
int n,i,k,len,t,r,l;
scanf("%d",&n);
while(n--)
{
scanf("%s",&s);
t=0;r=0;
len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]==',') continue;
if(s[i]=='a')
{
i+=3;
sc[t++]='a';
}
if(s[i]=='m')
{
if(s[i+1]=='i') sc[t++]='M';
else if(s[i+1]=='a') sc[t++]='m';
i+=3;
}
if(s[i]=='(')
{
sc[t++]='(';
}
if('0'<=s[i] && s[i]<='9')
{
int temp=s[i]-48;
for(k=i+1;s[k]!=','&&k<len&&s[k]!=')';k++) temp=temp*10+(s[k]-48);
i=k+1;
st[r++]=temp;
if(s[i-1]==')' || s[i-1]==',') {i-=2;continue;}
int tenp=s[i]-48;
for(l=i+1;s[l]!=')'&&l<len&&s[l]!=',';l++) tenp=tenp*10+(s[l]-48);
st[r++]=tenp;
i=l;
}
if(s[i]==')')
{
if(sc[t-2]=='M')
{
int f=min(st[--r],st[--r]);
t-=2;
st[r++]=f;
}
else if(sc[t-2]=='m')
{
int h=max(st[--r],st[--r]);
t-=2;
st[r++]=h;
}
else if(sc[t-2]=='a')
{
int g=add(st[--r],st[--r]);
t-=2;
st[r++]=g;
}
}
}
printf("%d\n",st[0]);
memset(s,'\0',sizeof(s));
}
return 0;
}
2:递归法:
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 1000
using namespace std;
char s[N];int t;
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a>b?b:a;}
int add(int a,int b) {return a+b;}
void init()
{
int i;
for(i=0;i<strlen(s);i++)
if(s[i]=='m' && s[i+1]=='a') s[i]='M';
}
int value(char s[],int len)
{
int val,k,i;
if('0'<=s[0] && s[0]<='9') {sscanf(s,"%d",&val);return val;}
for(k=0,i=0;i<len;i++)
{
if(s[i]=='(') k++;
if(s[i]==')') k--;
if(k==1 && s[i]==',')
{
if(s[0]=='a') return add(value(s+4,i-4),value(s+i+1,len-i+1));
else if(s[0]=='m') return min(value(s+4,i-4),value(s+i+1,len-i+1));
else if(s[0]=='M') return max(value(s+4,i-4),value(s+i+1,len-i+1));
}
}
}
int main ()
{
//freopen("biao.txt","r",stdin);
int n;
cin>>n;
getchar();
while(n--)
{
memset(s,'\0',sizeof(s));
cin>>s;
init();
t=0;
cout<<value(s,strlen(s))<<endl;
}
return 0;
}
3 递归精简法:
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 1000
using namespace std;
char s[N];int t;
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a>b?b:a;}
int add(int a,int b) {return a+b;}
void init()
{
int i;
for(i=0;i<strlen(s);i++)
if(s[i]=='m' && s[i+1]=='a') s[i]='M';
}
int value()
{
int val,k,i;
if(s[t]=='a') {t+=3;return add(value(),value());}
if(s[t]=='m') {t+=3;return min(value(),value());}
if(s[t]=='M') {t+=3;return max(value(),value());}
if(s[t]=='(' || s[t]==')' || s[t]==',') {t+=1;return value();}
sscanf(s+t,"%d%n",&val,&k);t+=k;return val;
}
int main ()
{
//freopen("biao.txt","r",stdin);
int n;
cin>>n;
getchar();
while(n--)
{
memset(s,'\0',sizeof(s));
cin>>s;
init();
t=0;
cout<<value()<<endl;
}
return 0;
}