#include #include #include #define STACK_SIZE 10 typedef struct { float values[STACK_SIZE]; int size; } stack; void stack_print (stack* stack); void stack_push (stack* stack,float value); float stack_pop (stack* stack); void my_exit(int flag, const char* input); int main(void) { stack* p_stack = (stack*) malloc(sizeof(stack)); memset(p_stack, 0, sizeof(stack)); while(1) { char str[128] = { 0 }; char* tres = fgets(str, 128, stdin); if(tres == NULL || str[0] == 0 || (str[1] == 0 && str[0] == '\n')) my_exit(1, "no input"); str[strlen(str) - 1] = 0; // if number if(strlen(str) > 1 || (str[0] >= '0' && str[0] <= '9')) { my_exit(p_stack->size >= STACK_SIZE, "full stack"); my_exit(str[0] == '.', "bad input"); float res = 0.f; int dots = 0; for(int i = 0; i < strlen(str); i++) if(str[i]=='.') dots++; else my_exit(str[i] < '0' || str[i] > '9', "bad input"); res = atof(str); stack_push(p_stack, res); } else { my_exit(p_stack->size < 2, "not enough operands"); float b = stack_pop(p_stack); float a = stack_pop(p_stack); char op = str[0]; float res; switch (op) { case '+': res = a + b; break; case '-': res = a - b; break; case '*': res = a * b; break; case '/': my_exit(b == 0.f, "division by zero"); res = a / b; break; default: my_exit(1, "bad input"); } stack_push(p_stack, res); } stack_print(p_stack); } free(p_stack); } void stack_print(stack* st) { for(int i = 0; i < st->size; i++) printf("%.2f ",st->values[i]); printf("\n"); } void stack_push(stack* st, float push_value) { if(st->size < STACK_SIZE) st->values[st->size++] = push_value; } float stack_pop(stack* st) { if(st->size > 0) return st->values[--st->size]; } void my_exit(int flag, const char* input) { if (flag) { printf("%s\n", input); exit(0); } }