Ask Question

You can combine the algorithms for converting between infix to postfix and for evaluating postfix to evaluate an infix expression directly. To do so you need two stacks: one to contain operators and the other to contain operands. When an operand is encountered, it is pushed onto the operand stack. When an operator is encountered, it is processed as described in the infix-to-postfix algorithm*. When an operator is popped off the operator stack, it is processed as described in the postfix evaluation algorithm: The top two operands are popped off the operand stack, the operation is performed, and the result is pushed back onto the operand stack. Write a program to evaluate infix expressions directly using this combined algorithm.

+1
Answers (1)
  1. 25 February, 14:22
    0
    Check the explanation

    Explanation:

    import java. util. Stack;

    /**

    * Class to evaluate infix and postfix expressions.

    *

    public class InfixPostfixEvaluator {

    /**

    * Operators in reverse order of precedence.

    */

    private static final String operators = "-+/*";

    private static final String operands = "0123456789";

    public int evalInfix (String infix) {

    return evaluatePostfix (convert2Postfix (infix));

    }

    public String convert2Postfix (String infixExpr) {

    char[] chars = infixExpr. toCharArray ();

    Stack stack = new Stack ();

    StringBuilder out = new StringBuilder (infixExpr. length ());

    for (char c : chars) {

    if (isOperator (c)) {

    while (! stack. isEmpty () && stack. peek () ! = ' (') {

    if (operatorGreaterOrEqual (stack. peek (), c)) {

    out. append (stack. pop ());

    } else {

    break;

    }

    }

    stack. push (c);

    } else if (c = = ' (') {

    stack. push (c);

    } else if (c = = ') ') {

    while (! stack. isEmpty () && stack. peek () ! = ' (') {

    out. append (stack. pop ());

    }

    if (! stack. isEmpty ()) {

    stack. pop ();

    }

    } else if (isOperand (c)) {

    out. append (c);

    }

    }

    while (! stack. empty ()) {

    out. append (stack. pop ());

    }

    return out. toString ();

    }

    public int evaluatePostfix (String postfixExpr) {

    char[] chars = postfixExpr. toCharArray ();

    Stack stack = new Stack ();

    for (char c : chars) {

    if (isOperand (c)) {

    stack. push (c - '0'); / / convert char to int val

    } else if (isOperator (c)) {

    int op1 = stack. pop ();

    int op2 = stack. pop ();

    int result;

    switch (c) {

    case '*':

    result = op1 * op2;

    stack. push (result);

    break;

    case '/':

    result = op2 / op1;

    stack. push (result);

    break;

    case '+':

    result = op1 + op2;

    stack. push (result);

    break;

    case '-':

    result = op2 - op1;

    stack. push (result);

    break;

    }

    }

    }

    return stack. pop ();

    }

    private int getPrecedence (char operator) {

    int ret = 0;

    if (operator = = '-' || operator = = '+') {

    ret = 1;

    } else if (operator = = '*' || operator = = '/') {

    ret = 2;

    }

    return ret;

    }

    private boolean operatorGreaterOrEqual (char op1, char op2) {

    return getPrecedence (op1) > = getPrecedence (op2);

    }

    private boolean isOperator (char val) {

    return operators. indexOf (val) > = 0;

    }

    private boolean isOperand (char val) {

    return operands. indexOf (val) > = 0;

    }

    }
Know the Answer?
Not Sure About the Answer?
Find an answer to your question 👍 “You can combine the algorithms for converting between infix to postfix and for evaluating postfix to evaluate an infix expression directly. ...” in 📗 Computers & Technology if the answers seem to be not correct or there’s no answer. Try a smart search to find answers to similar questions.
Search for Other Answers