#include #include int main(int argc, char** argv){ if(argc < 2){ printf("Usage:\n\t%s \"S\"\n\t\tWhere S is a string in reverse polish notation.\n",argv[0]); return EXIT_SUCCESS; } double stack[512]; double read; int size = 0; char* str = argv[1]; char* rtn = NULL; stack[0] = 0; while(str != NULL && str[0] != '\0'){ switch (str[0]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': read = strtod(str,&rtn); if(rtn != str){ str = rtn; stack[size] = read; size++; }else{ fprintf(stderr,"Error at position %ld\nUnable to read a number\n", str-argv[1]); return EXIT_FAILURE; } break; case '-': if(str[1] != '\0' && str[1] >= '0' && str[1] <= '9'){ read = strtod(str,&rtn); if(rtn != str){ str = rtn; stack[size] = read; size++; }else{ fprintf(stderr,"Error at position %ld\nUnable to read a number\n", str-argv[1]); return EXIT_FAILURE; } }else{ if(size<2){ fprintf(stderr,"Error at position %ld\nNot enough operands for substraction\n", str-argv[1]); return EXIT_FAILURE; }else{ stack[size-2] = stack[size-2] - stack[size-1]; size--; str++; } } break; case '*': if(size<2){ fprintf(stderr,"Error at position %ld\nNot enough operands for multiplication (%d)\n", str-argv[1],size); return EXIT_FAILURE; }else{ stack[size-2] = stack[size-2] * stack[size-1]; size--; str++; } break; case '+': if(size<2){ fprintf(stderr,"Error at position %ld\nNot enough operands for addition\n", str-argv[1]); return EXIT_FAILURE; }else{ stack[size-2] = stack[size-2] + stack[size-1]; size--; str++; } break; case '/': if(size<2){ fprintf(stderr,"Error at position %ld\nNot enough operands for division\n", str-argv[1]); return EXIT_FAILURE; }else{ stack[size-2] = stack[size-2] / stack[size-1]; size--; str++; } break; default: str++; break; } } if(size > 1){ fprintf(stderr,"Error: %d values left on the stack\n",size); return EXIT_FAILURE; } printf("%f\n",stack[0]); return EXIT_SUCCESS; }