#include #include #include #include #include #define MAX_RAZMER 10 typedef struct { double chisla[MAX_RAZMER]; int vershina; } StEk; void inicStEk(StEk* stek) { stek->vershina = 0; } int isEmpty(StEk* stek) { return stek->vershina == 0; } int isFull(StEk* stek) { return stek->vershina == MAX_RAZMER; } void push(StEk* stek, double chislo) { if (isFull(stek)) { printf("no input\n"); exit(1); } stek->chisla[stek->vershina] = chislo; stek->vershina++; } double pop(StEk* stek) { if (isEmpty(stek)) { printf("no input\n"); exit(1); } return stek->chisla[--stek->vershina]; } int main() { StEk stek; inicStEk(&stek); char bufer[256]; while (fgets(bufer, sizeof(bufer), stdin) != NULL) { char* konec; double chislo = strtod(bufer, &konec); if (*konec == '\n' && *bufer != '\n' && *bufer != ' ') { push(&stek, chislo); } else if (strcmp(konec, "+\n") == 0) { if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double b = pop(&stek); if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double a = pop(&stek); push(&stek, a + b); } else if (strcmp(konec, "-\n") == 0) { if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double b = pop(&stek); if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double a = pop(&stek); push(&stek, a - b); } else if (strcmp(konec, "*\n") == 0) { if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double b = pop(&stek); if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double a = pop(&stek); push(&stek, a * b); } else if (strcmp(konec, "/\n") == 0) { if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double b = pop(&stek); if (isEmpty(&stek)) { printf("no input\n"); exit(1); } double a = pop(&stek); if (b == 0) { printf("division by zero\n"); return 0; exit(1); } push(&stek, a / b); } else if (isalpha(konec[-1])) { printf("bad input\n"); exit(1); return 0; } else { printf("bad input\n"); exit(1); } for (int i = 0; i < stek.vershina; i++) { printf("%.2lf ", stek.chisla[i]); } printf("\n"); } printf("no input\n"); return 0; }