#include #include #include #include #define STACK_SIZE 10 struct stack { float values[STACK_SIZE]; int size; }; //push number to the stack void push(struct stack* stack,float values){ if(stack->size < 10){ stack->values[stack->size] = values; stack->size += 1; } else{ printf("full stack\n"); exit(0); } } //pop number from the stack float pop(struct stack *stack){ if(stack->size > 0){ float value = stack->values[stack->size-1]; stack->size -= 1; return value; } else{ printf("not enough operands\n"); exit(0); } } void print_stack(struct stack *stack){ int i; int len = stack->size - 1; for(i = 0; i < len; i++){ printf("%0.2f ", stack->values[i]); } if(stack->size != 0){ printf("%0.2f ", stack->values[i]); printf("\n"); } } int main() { struct stack mystack; memset(&mystack, 0, sizeof(struct stack)); int i = 0; for(i = 0; i < 100; i++){ char line[10]; char *x = fgets(line, 10, stdin); float r = 0; float z = 0; //if string is not empty if(line[1] != 0 && x != NULL){ //if there is a wrong symbol if(!isdigit(line[0]) && line[0] != '+' && line[0] != '*' && line[0] != '/' && line[0] != '-'){ printf("bad input\n"); return 0; } if(line[0] == '+'){ r = pop(&mystack) + pop(&mystack); } else if(line[0] == '-'){ z = pop(&mystack); //swap numbers(e.g input "3 4 -" r = pop(&mystack) - z; //output 3 - 4, not 4 - 3) } else if(line[0] == '*'){ r = pop(&mystack) * pop(&mystack); } else if(line[0] == '/'){ z = pop(&mystack); if(z == 0){ printf("division by zero\n"); return 0; } else { r = pop(&mystack) / z; } } //if symbol is not operation, than it is number //change string to float else { r = strtof(line,&x); } //push result to stack push(&mystack,r); print_stack(&mystack); } else{ printf("no input\n"); return 0; } } return 0; }