#include #include #include #include #include #define STACK_SIZE 10 #define LINESIZE 100 struct stack { float values[STACK_SIZE]; int size; }; //zakladne funkcie void push_stack(struct stack *s, float value) { if (s->size >= STACK_SIZE) { printf("full stack\n"); exit(0); } s->values[s->size] = value; s->size++; } float pop_stack(struct stack *s) { if (s->size <= 0) { printf("empty stack\n"); exit(0); } s->size--; return s->values[s->size]; } void print_stack(struct stack *s) { for (int i = 0; i < s->size; i++) { printf("%.2f ", s->values[i]); } printf("\n"); } //pomocne funkcie //je retazec cislo int is_number(const char *str) { char *endptr; strtof(str, &endptr); // ak endptr ukazuje na koniec retazca, bolo to cele cislo return (*str != '\0' && *endptr == '\0'); } int main(void) { struct stack s; memset(&s, 0, sizeof(struct stack)); char line[LINESIZE]; int had_input = 0; while (fgets(line, sizeof(line), stdin)) { had_input = 1; line[strcspn(line, "\n")] = '\0'; //preskocit prazdny riadok if (strlen(line) == 0) continue; if (is_number(line)) { float value = strtof(line, NULL); push_stack(&s, value); } else if (strlen(line) == 1 && strchr("+-*/", line[0])) { //operacia if (s.size < 2) { printf("not enough operands\n"); return 0; } float b = pop_stack(&s); float a = pop_stack(&s); float result; switch (line[0]) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': if (b == 0) { printf("division by zero\n"); return 0; } result = a / b; break; default: printf("Chyba: neznama operacia.\n"); return 0; } push_stack(&s, result); } else { printf("bad input\n"); return 0; } print_stack(&s); } if (had_input) { printf("no input\n"); } return 0; }