/* Stack evaluation of Polish. */ int evaluate(TOP *polish) { TOP eval = NULL; /* empty evaluation stack */ DATA temp; char bin_op; int arg1, arg2; while (!isempty(*polish)) { pop(polish, &temp); if (temp.kind == operator) { bin_op = temp.u.op; pop(&eval, &temp); arg2 = temp.u.val; pop(&eval, &temp); arg1 = temp.u.val; temp.kind = value; switch (bin_op) { case '+': temp.u.val = arg1 + arg2; break; case '-': temp.u.val = arg1 - arg2; break; case '*': temp.u.val = arg1 * arg2; } push(&eval, temp); } else /* temp.kind == value */ push(&eval, temp); } pop(&eval, &temp); return (temp.u.val); }