表达式求值

来源:互联网 发布:java入门教程电子书 编辑:程序博客网 时间:2024/06/07 12:18

1  模拟法:

#include <iostream>#include <stdio.h>#include <string.h>#define N 10000using 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 1000using 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 1000using 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;}