#include #include #include #include //// @ #define STACK_SIZE 200 struct Stack { char values[STACK_SIZE]; int size; }; void push_stack(struct Stack* stack, float value); char pop_stack(struct Stack* stack); int count_stack(struct Stack* stack); void push_stack(struct Stack* stack, char value) { assert(stack->size < STACK_SIZE); stack->values[stack->size] = value; stack->size += 1; } char pop_stack(struct Stack* stack) { assert(stack->size > 0); char value = stack->values[stack->size-1]; stack->size -= 1; return value; } int count_stack(struct Stack* stack) { return stack->size; } void print_stack(struct Stack* stack) { for (int i=0; isize; i++) { printf("%.2f ", stack->values[i]); } printf("\n"); } char para(char c) { if(c=='(') return ')'; if(c=='<') return '>'; if(c=='{') return '}'; if(c=='[') return ']'; if(c==')') return '('; if(c=='>') return '<'; if(c=='}') return '{'; if(c==']') return '['; } int main() { struct Stack mystack; mystack.size=0; char str[128]; scanf("%s", str); printf("Read: %s", str); int i=0; char c, cs; while(str[i]!='\0') { c=str[i]; if(c=='<'||c=='('||c=='{'||c=='[') { push_stack(&mystack, c); } if(c=='>') { cs=pop_stack(&mystack); if(cs!='<') { printf("Crossed bracket %c in %d, expected %c", c, i); } } } int err=0; char buf[505]; do { char* p=fgets(buf, 299, stdin); if(p) { char c=buf[0]; float op1, op2, rez; if(c=='+'||c=='-'||c=='/'||c=='*') { if(count_stack(&mystack)<2) { printf("not enough operands\n"); err=3; break; } op2=pop_stack(&mystack); op1=pop_stack(&mystack); switch(c) { case '+': rez=op1+op2; break; case '-': rez=op1-op2; break; case '/': if(c=='/' && op2==0) { err=1; printf("division by zero\n"); } else rez=op1/op2; break; case '*': rez=op1*op2; break; } } else { if(isdigit(c)) { rez=atof(buf); } else { err=1; printf("bad input\n"); } } if(!err) { if(count_stack(&mystack)==STACK_SIZE) { printf("full stack\n"); err=4; break; } push_stack(&mystack, rez); print_stack(&mystack); } } else break; }while(1); if(!err) printf("no input\n"); return 0; }