Volume0-0087 Strange Mathematical Expression
問題
逆ポーランド記法 | Aizu Online Judge
逆ポーランド記法を実装する問題です。アルゴリズム自体は何の捻りもありません。スタックを使うやつですね。
#include<stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> void push(double S[],int *top,double x){ S[(*top)]=x; (*top)++; return; } double pop(double S[],int *top){ (*top)--; return S[(*top)]; } int main(){ char str[81]; int i,j; int R,top; char temp[10]; double S[80]; double x1,x2; while(fgets(str,sizeof str,stdin)!=NULL){ R=strlen(str); j=0; i=0; top=0; while(i<=R){ if(i<R && str[i]!=' ')temp[j++]=str[i++]; else { temp[j]='\0'; if(isdigit(temp[0]))/*正の数*/ push(S,&top,atof(temp)); else if( !isdigit(temp[0]) && isdigit(temp[1]) )/*負の数*/ push(S,&top,atof(temp)); else {/*記号*/ x1=pop(S,&top); x2=pop(S,&top); switch(temp[0]){ case '+':push(S,&top,x2+x1); break; case '-':push(S,&top,x2-x1); break; case '*':push(S,&top,x2*x1); break; case '/':push(S,&top,x2/x1); break; } } i++; j=0; } } printf("%.6lf\n",S[0]); } return 0; }
str[i]が空白だったときにiを増やし忘れて、無限ループに陥るというミス…トレースして気付きました。
あと不可解なのが、型の問題です。floatで手元では正解するのですが、提出するとwrongになってしまいました。
試しに全てdoubleに変えたらあっさりacceptされました。よくわからん。