#include #include #include #include #define SIZE 10 struct stack{ float values[SIZE]; int size; }; void print(struct stack *s) { if (s->size == 0){ printf("no input\n"); return; } for(int i = 0; i < s->size; i++){ printf("%.2f ", s->values[i]); } printf("\n"); } void push(struct stack *s, float value) { assert(s->size < SIZE); s->values[s->size] = value; s->size += 1; } float pop(struct stack *s) { assert(s->size > 0); s->size -= 1; return s->values[s->size]; } int main(){ struct stack mystack; memset(&mystack,0,sizeof(struct stack)); char x[100]; while(fgets(x, 100, stdin)){ x[strcspn(x, "\n")] = 0; if (strlen(x) == 0) { print(&mystack); continue; } char *endptr; float num = strtof(x, &endptr); if (*endptr == '\0') { // je cislo if(mystack.size >= SIZE) { printf("full stack\n"); return 1; } push(&mystack,num); } else if(strlen(x) == 1 && strchr("+-/*", x[0])) { if (mystack.size < 2){ printf("not enough operands\n"); return 0; } float a = pop(&mystack); float b = pop(&mystack); float result = 0; switch(x[0]){ case '+': result = b + a; break; case '-': result = b - a; break; case '*': result = b * a;break; case '/': if(a == 0){ printf("division by zero\n"); return 0; } result = b / a; break; } push(&mystack,result); } else{ printf("bad input\n"); return 0; } print (&mystack); } printf("no input\n"); if(mystack.size == 0){ printf("no input\n"); } return 0; }