生活随笔
收集整理的這篇文章主要介紹了
NYOJ 305 表达式求值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
表達式求值
時間限制:
3000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
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?)也是表達式,其值為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 AC碼: #include<stdio.h>
#include<string.h>
int main()
{int n,len,num[80],result[200];char str[305];scanf("%d",&n);while(n--){scanf("%s",str);len=strlen(str);int i=0,j=-1,sum=0,k=0,p;while(i<len){if(str[i]=='a'){num[++j]=1;i=i+4;}else if(str[i]=='m'){if(str[i+1]=='i')num[++j]=2;if(str[i+1]=='a')num[++j]=3;i=i+4;}else if(str[i]>='0'&&str[i]<='9'){sum=0;while(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}result[k++]=sum;}else if(str[i]==')'){p=num[j--];k--;if(p==1){result[k-1]=result[k]+result[k-1];}if(p==2)result[k-1]=result[k]>result[k-1]?result[k-1]:result[k];if(p==3)result[k-1]=result[k]>result[k-1]?result[k]:result[k-1];i++;}elsei++;}printf("%d\n",result[0]);}return 0;
}
AC碼: #include<stdio.h>
char str[1005];
int i;
int eval()
{int x=0,a,b;while(str[i]==','||str[i]==')')i++;if(str[i+1]=='d'){i=i+4;return eval()+eval();}if(str[i+1]=='i'){i=i+4;a=eval();b=eval();return a<b?a:b;}if(str[i+1]=='a'){i=i+4;a=eval();b=eval();return a>b?a:b;}while(str[i]>='0'&&str[i]<='9'){x=x*10+str[i]-'0';i++;}return x;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%s",str);i=0;printf("%d\n",eval());}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 305 表达式求值的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。