生活随笔
收集整理的這篇文章主要介紹了
NYOJ 267 郁闷的C小加(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
郁悶的C小加(二)
時間限制:
1000?ms ?|? 內存限制:
65535?KB 難度:
4
描述
聰明的你幫助C小加解決了中綴表達式到后綴表達式的轉換(詳情請參考“郁悶的C小加(一)”),C小加很高興。但C小加是個愛思考的人,他又想通過這種方法計算一個表達式的值。即先把表達式轉換為后綴表達式,再求值。這時又要考慮操作數是小數和多位數的情況。
輸入第一行輸入一個整數T,共有T組測試數據(T<10)。
每組測試數據只有一行,是一個長度不超過1000的字符串,表示這個運算式,每個運算式都是以“=”結束。這個表達式里只包含+-*/與小括號這幾種符號。其中小括號可以嵌套使用。數據保證輸入的操作數中不會出現負數并且小于1000000。
數據保證除數不會為0。
輸出對于每組測試數據輸出結果包括兩行,先輸出轉換后的后綴表達式,再輸出計算結果,結果保留兩位小數。兩組測試數據之間用一個空行隔開。樣例輸入 2 1+2= (19+21)*3-4/5= 樣例輸出 12+= 3.00 1921+3*45/-= 119.20 AC碼: #include<stdio.h>
double fun(double a,double b,char x)
{if(x=='+')return b+a;if(x=='-')return b-a;if(x=='*')return b*a;if(x=='/')return b/a;
}
int main()
{int T,i,top1,top2;double x,t,num[1000],a,b;char str[1005],ch[1000];scanf("%d",&T);while(T--){scanf("%s",str);top1=-1;top2=-1;for(i=0;str[i]!='\0';i++){x=0;if(str[i]>='0'&&str[i]<='9'){while(str[i]>='0'&&str[i]<='9'){printf("%c",str[i]);x=x*10+str[i]-'0';i++;}if(str[i]=='.'){printf("%c",str[i]);i++;t=0.1;while(str[i]>='0'&&str[i]<='9'){printf("%c",str[i]);x=x+(str[i]-'0')*t;t=t*0.1;i++;}}top1++;num[top1]=x;}if(str[i]=='\0')break;if(str[i]=='('){top2++;ch[top2]=str[i];}else if(str[i]==')'){while(top2>=0&&ch[top2]!='('){printf("%c",ch[top2]);a=num[top1];top1--;b=num[top1];num[top1]=fun(a,b,ch[top2]);top2--;}top2--;}else if(str[i]=='*'||str[i]=='/'){while(ch[top2]=='*'||ch[top2]=='/'){printf("%c",ch[top2]);a=num[top1];top1--;b=num[top1];num[top1]=fun(a,b,ch[top2]);top2--;}top2++;ch[top2]=str[i];}else{while(top2>=0&&ch[top2]!='('){printf("%c",ch[top2]);a=num[top1];top1--;b=num[top1];num[top1]=fun(a,b,ch[top2]);top2--;}top2++;ch[top2]=str[i];}}while(top2>=0){printf("%c",ch[top2]);a=num[top1];top1--;b=num[top1];num[top1]=fun(a,b,ch[top2]);top2--;}printf("\n%.2f\n",num[0]);}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 267 郁闷的C小加(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。