#include #include #include #include #include #define STACK_SIZE 10 struct stack { float values[STACK_SIZE]; int size; }; void push_stack(struct stack* mystack, float value) { assert(mystack->sizevalues[mystack->size]=value; mystack->size+=1; } int switch_operators(const char input[]) { if(strlen(input)==1) { switch (input[0]) { case '+': return 0; break; case '-': return 0; break; case '*': return 0; break; case '/': return -1; break; } } return 1; } float pop_stack(struct stack* mystack,const char input[]) { assert(mystack->size>1); float val1=mystack->values[mystack->size-2]; float val2=mystack->values[mystack->size-1]; switch (input[0]) { case '+': mystack->size-=2; return val1+val2; break; case '-': mystack->size-=2; return val1-val2; break; case '*': mystack->size-=2; return val1*val2; break; case '/': mystack->size-=2; return val1/val2; break; default: break; } } void print_stack(struct stack* mystack) { for(int i=0;isize;i++) { printf("%.2f",mystack->values[i]); if (isize-1) { printf(" "); } } printf(" \n"); } int is_whitespace(const char* str) { while (*str) { if (!isspace((unsigned char)*str)) { return 0; } str++; } return 1; } int main() { struct stack mystack; memset(&mystack,0,sizeof(struct stack)); char input[1000]; while (fgets(input,sizeof(input),stdin)!=NULL) { int flag=switch_operators(input); input[strcspn(input,"\n")]=0; if (flag==0 || flag==-1) { if(flag==-1 && mystack.values[mystack.size-1]==0) { printf("division by zero\n"); return 0; } float op_num=pop_stack(&mystack,input); push_stack(&mystack,op_num); } else { char* ptr; if (*ptr!='\0' && !is_whitespace(ptr)) { printf("bad input\n"); return 0; } float num=strtof(input,&ptr); push_stack(&mystack,num); } print_stack(&mystack); } printf("no input\n"); return 0; }