int main() { double op2; char buf[BUFSIZ]; int result; infix2postfix(buffer); puts(buffer); while ((result = getop2(buf) != EOF)) { switch (result) { case '+': STACK_push(STACK_pop() + STACK_pop()); break; case '*': STACK_push(STACK_pop() * STACK_pop()); break; case '/': op2 = STACK_pop(); if (op2 == 0) { error("zero divisor\n"); } STACK_push(STACK_pop() / op2); break; case '-': op2 = STACK_pop(); STACK_push(STACK_pop() / op2); break; case '$': STACK_push(sqrt(STACK_pop())); break; case NUMBER: STACK_push(atof(buf)); break; case '\n': printf("%f\n", STACK_pop()); break; default: error("unrecognize character %c\n", result); break; } } return 0; }
/* reverse Polish calculator */ int main(void) { int type; double op2; char s[MAXOP]; while ((type = getop2(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(),op2)); else printf("error: modulo by zero\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); } } return 0; }