#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[]) { switch (input[0]) { case '+': return 0; break; case '-': return 0; break; case '*': return 0; break; case '/': return -1; break; } } 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 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); if(mystack.size==10) { printf("full stack\n"); return 0; } if((input[0]>=0 && input[0]<=47 && input[0]!=43 && input[0]!=45 && input[0]!=42 && input[0]!=47 && (input[0]<48 || input[0]>57)) || (input[0]>=58 && input[0]<=127)) { printf("bad input\n"); return 0; } 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; } if(mystack.size==1) { printf("not enough operands\n"); return 0; } float op_num=pop_stack(&mystack,input); push_stack(&mystack,op_num); } else { char* ptr; float num=strtof(input,&ptr); push_stack(&mystack,num); } print_stack(&mystack); } printf("no input\n"); return 0; }