#include #include #include #include #define STACK_SIZE 10 struct stack { float values[STACK_SIZE]; int size; }; void init(struct stack *s){ s->size=0; //inicializacia stacku } int is_empty(struct stack *s){return s->size==0;} // check if stack is empty int is_full(struct stack *s){return s->size==STACK_SIZE;} void push(struct stack *s, float value){ if (is_full(s)){ printf("full stack\n"); exit(0); } s->values[s->size++]=value; // pridava cislo do stacku a size +=1 } float pop (struct stack *s){ if (is_empty(s)){ printf("Stack is empty"); return 1; } return s->values[--(s->size)]; // najprv - size, potom vybera jednu polozku } void print_s(struct stack *s){ for(int i =0;isize;i++){ printf("%.2f ", s->values[i]); } printf("\n"); } int main(){ struct stack mystack; init(&mystack); char input[100]; while(fgets(input, sizeof(input), stdin)){ input[strcspn(input,"\n")]='\0'; char *endpt; float num = strtod(input,&endpt); // oddeli vsetky cisla (medzerami) a posledne zapise do endpt if(endpt!=input&&*endpt=='\0'){ // ked endpt!= plnomu inputu a nie je koncom inputu push(&mystack,num); } else if (strlen(input)==1&&strchr("+-*/",input[0])){ // ak dlzka inputu po upravach 1 a to nojeaky operator if (mystack.size<2){ // previerka na to ci mame cisla pre operacie printf("not enough operands\n"); return 0;} float b=pop(&mystack); float a = pop(&mystack); float result = 0; if (input[0]=='+') result=a+b; if (input[0]=='-') result=a-b; if (input[0]=='*') result=a*b; if (input[0]=='/'){ if (b==0) {printf("division by zero\n");return 0;} result=a/b; } push(&mystack, result); } else{ printf("bad input\n"); return 0; } print_s(&mystack); } printf("no input\n"); return 0; }