Использование двух стеков для оценки выражения инфикса - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно создать два стека и оценить выражение инфикса, например 3 + 4 + (5 -2).Я создал код, делающий это с постфиксом, чтобы создать базу, так как это проще и работает безупречно!Теперь у меня проблема с круглыми скобками, я не знаю, как проверить, чтобы круглые скобки были сбалансированы, а затем, если они правильно оценивают выражение.Это должно быть что-то вроде:

Type a balanced infix expression: 5 * (4 + 3)
The result is 35
Type a balanced infix expression: 10 / (2 + 1
Not balanced, try again :

Вот тестер

import java.util.*;
public class InfixTester { //it's postfix at the moment
    public static void main(String[] args) {
        String expression, retry;
        int result;

        Scanner scan = new Scanner (System.in);

        do {
            InfixEvaluator evaluator = new InfixEvaluator(); //in reality is postfix rn
                System.out.println ("Type a balanced postfix expression one token at a time:");
                expression = scan.nextLine();

                result = evaluator.evaluate(expression);
                System.out.println();
                System.err.println("The result is " + result);

                System.out.print("Would you like to continue (y/n)? ");
                retry = scan.nextLine();
                System.out.println();
        }
        while (retry.equalsIgnoreCase("y"));
    }
}

А вот оценщик, где все

import java.util.*;
public class InfixEvaluator {  //it's actually postfix right now
    private final static char ADD = '+';
    private final static char SUBSTRACT =  '-';
    private final static char MULTIPLY = '*';
    private final static char DIVIDE = '/';

    private Stack <Integer> stack;
    public InfixEvaluator() {
        stack = new Stack <Integer>();
    }

    public int evaluate(String expr) {
        int op1, op2, result = 0;
        String token;
        Scanner parser = new Scanner (expr);

        while (parser.hasNext()) {
            token = parser.next();

            if (isOperator (token)) {
                op2 = (stack.pop()).intValue();
                op1 = (stack.pop()).intValue();
                result = evaluateSingleOperator(token.charAt(0), op1, op2);
                stack.push(new Integer (result));
            }
            else
                stack.push(new Integer (Integer.parseInt (token)));
        }
        return result;
    }

    private boolean isOperator (String token){
        return ( token.equals("+") || token.equals("-") ||
                token.equals("*") || token.equals("/"));
    }

    private int evaluateSingleOperator(char operation, int op1, int op2){
        int result = 0;

        switch  (operation){
            case ADD:
                result = op1 + op2;
                break;
            case SUBSTRACT:
                result = op1 - op2;
                break;
            case MULTIPLY:
                result = op1 * op2;
                break;
            case DIVIDE:
                result = op1 / op2;
                break;                                
        }
        return result;
    }
}

Пока все это работает простохорошо для постфиксных выражений, что мне нужно изменить и добавить, чтобы вместо этого правильно оценить выражения инфикса?Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2019

Я предполагаю, что эти два стека предназначены для операторов и для промежуточных результатов.Вы можете подтолкнуть открытый парен к вашему стеку оператора.Когда вы столкнетесь с близким парнем, вытолкните стопку и убедитесь, что это открытый парен.Если это так, вам не нужно ничего делать.Вершина стека «промежуточных результатов» - это значение выражения в скобках.Если вершина стека не была открытой пареной, оцените оператора как обычно.

...