はなたの日記

ギターのコードについて書きます

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されました。よくわからん。