表示式求值 (遞迴實現)
表示式求值
題目描述
Dr.Kong設計的機器人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它知道函式min(20,23)的值是20 ,add(10,98) 的值是108等等。經過訓練,Dr.Kong設計的機器人卡多甚至會計算一種巢狀的更復雜的表示式。
假設表示式可以簡單定義為:
1. 一個正的十進位制數 x 是一個表示式。
2. 如果 x 和 y 是 表示式,則 函式min(x,y )也是表示式,其值為x,y 中的最小數。
3. 如果 x 和 y 是 表示式,則 函式max(x,y )也是表示式,其值為x,y 中的最大數。
4.如果 x 和 y 是 表示式,則 函式add(x,y
例如, 表示式 max(add(1,2),7) 的值為 7。
請你編寫程式,對於給定的一組表示式,幫助 Dr.Kong 算出正確答案,以便校對卡多計算的正誤。
輸入
第一行: N 表示要計算的表示式個數 (1≤ N ≤ 10)
接下來有N行, 每行是一個字串,表示待求值的表示式
(表示式中不會有多餘的空格,每行不超過300個字元,表示式中出現的十進位制數都不
超過1000。)
輸出
輸出有N行,每一行對應一個表示式的值。
樣例輸入
3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
樣例輸出
3
999
200
題意概括:
一共有三個數學函式,add和min和max,裡面會出現兩個甚至多個函式巢狀的形式,計算出所給的數學函式的結果;
解題思路:
首先吃掉一個字串,呼叫ff這個函式,ff這個函式的功能主要是判斷傳過來的字元是否是字母,如果是字母,則說明這是一個函式,然後將函式裡面的逗號前面和逗號後面分開,呼叫到對應的函式裡面,如果ff接受到的是數字,則將字元轉化為數字輸出,三個數學函式,分貝計算出函式的兩個值,最後返回;
程式碼:
#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #define N 2000 int ff(char str[]); int minn(char str1[],char str2[]) { int a,b; char ch1[N],ch2[N]; int i,j,l,k; a=ff(str1); b=ff(str2); if(a>b) return b; else return a; } int addd(char str1[],char str2[]) { int a,b; char ch1[N],ch2[N]; int i,j,l,k; a=ff(str1); b=ff(str2); return a+b; } int maxx(char str1[],char str2[]) { int a,b; char ch1[N],ch2[N]; int i,j,l,k; a=ff(str1); b=ff(str2); if(a>b) return a; else return b; } int ff(char str[]) { char ch1[N],ch2[N]; int i,j,n,m,k; int len=strlen(str); if(isalpha(str[0])){ m=0; n=0; for(i=0,j=0,k=0;i<len;i++){ if(str[i]==')') m--; if(m==1&&str[i]==','){ n=1; } if(m>0){ if(n==0) ch1[j++]=str[i]; else if(n==1){ n++; }else ch2[k++]=str[i]; } if(str[i]=='('){ m++; } } ch1[j]='\0'; ch2[k]='\0'; // puts(ch1); // puts(ch2); if(str[0]=='a'){ return addd(ch1,ch2); }else if(str[0]=='m'&&str[1]=='a'){ return maxx(ch1,ch2); }else { return minn(ch1,ch2); } }else { m=0; for(i=0;i<len;i++){ m=m*10+str[i]-'0'; } return m; } } int main () { int t,i,j,n,m,k; char str[2000]; char ch1[N],ch2[N]; scanf("%d",&t); while(t--){ scanf("%s",str); printf("%d\n",ff(str)); } return 0; }