【ACM】nyoj_305_表达式求值_201308081018
表達式求值
時間限制: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
來源
第四屆河南省程序設計大賽
?
?
#include <stdio.h>
#include <string.h>
char str[1100];
char a[1100];
int b[1100];
int count(int a,int b,char c)
{
??? if(c=='a')
??? return a>b?a:b;
??? if(c=='d')
??? return a+b;
??? if(c=='i')
??? return a<b?a:b;
}
int main()
{
??? int N;
??? scanf("%d",&N);
??? while(N--)
??? {
??????? int i,atop,btop,t;
??????? memset(str,0,sizeof(str));
??????? memset(a,0,sizeof(a));
??????? memset(b,0,sizeof(b));
??????? atop=btop=1;
??????? scanf("%s",str);
??????? for(i=0;i<strlen(str);)
??????? {
??????????? if(str[i]>='a'&&str[i]<='z')
??????????? {
??????????????? i++;
??????????????? if(str[i]=='d')
??????????????? a[atop++]='d';
??????????????? else if(str[i]=='a')
??????????????? a[atop++]='a';
??????????????? else if(str[i]=='i')
??????????????? a[atop++]='i';
??????????????? i+=2;
??????????? }? //將 三種運算進棧,
??????????? else if(str[i]=='('||str[i]==',')
??????????? i++;
??????????? else if(str[i]>='0'&&str[i]<='9')
??????????? {
??????????????? t=0;
??????????????? while(str[i]>='0'&&str[i]<='9')
??????????????? {
??????????????????? t=t*10+str[i]-'0';
??????????????????? i++;
??????????????? }// 將數字進棧
??????????????? b[btop++]=t;
????//printf("%d\n",i);
??????????? }
??????????? else if(str[i]==')') //如果出現右括號,則拿出兩個數字和一個字符進行運算? 出棧
??????????? {
??????????????? t=count(b[--btop],b[--btop],a[--atop]);
??????????????? b[btop++]=t;
??????????????? i++;
??????????????? //printf("%d\n",t);
??????????? }
??????? }
??????? //printf("%d\n",b[1]);
??????? printf("%d\n",b[--btop]);//和上一句等價
??? }
??? return 0;
}
?
//棧的簡單運用
轉載于:https://www.cnblogs.com/xl1027515989/p/3245344.html
總結
以上是生活随笔為你收集整理的【ACM】nyoj_305_表达式求值_201308081018的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android项目中values中几个文
- 下一篇: poj 1860 Currency Ex