usaa25/du3/program.c
2025-11-06 22:47:42 +01:00

91 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#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;i<s->size;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;
}