diff --git a/cv3/program.c b/cv3/program.c index e69de29..ce6f1d8 100644 --- a/cv3/program.c +++ b/cv3/program.c @@ -0,0 +1,133 @@ +#include +#include +#include + +#define MAX_RAZMER 100 + +/* + * Структура, описывающая стек + */ +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)) { + char* konec; + double chislo = strtod(bufer, &konec); + if(*konec == '\n') { + 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); + push(&stek, a / b); + } else { + printf("no input\n"); + exit(1); + } + for(int i = 0; i < stek.vershina; i++) { + printf("%.2lf ", stek.chisla[i]); + } + printf("\n"); + } + return 0; +} \ No newline at end of file