usaa24/cv3/program.c

133 lines
3.2 KiB
C
Raw Normal View History

2024-10-12 20:09:28 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}