Оценка инфиксных выражений целых чисел без знака с использованием 2 стеков и получение неправильного ответа - PullRequest
0 голосов
/ 02 июля 2018

Я пишу программу для класса, которая, как следует из заголовка, оценивает инфиксные выражения целых чисел без знака, используя два стека. Деление должно быть целочисленным делением, поэтому числа целые, а не двойные. Я создал графический интерфейс, который получает ввод от пользователя и должен возвращать ответ. Я прикрепил ActionListener к кнопке для вычисления с использованием этого кода:

result = Evaluate.evalExp(txtExp.getText());
            txtResult.setText(result + "");

Проблема в том, что когда я запускаю программу, я не получаю правильный ответ. Для 3-4 я получу 3, для 6/2 я получу 2, а для всего, что содержит скобки, я получу 0 за ответ. Я пытался выяснить это для большей части дня без каких-либо результатов. Я надеюсь, что кто-то здесь сможет помочь.

import java.util.Stack;

открытый класс Evaluate {

public static int evalExp(String input) {

    char[] tokens = input.toCharArray();

    Stack<Integer> number = new Stack<Integer>();
    Stack<Character> operator = new Stack<Character>();

    int holder = 0;
    int ans;

    for (int i=0; i < tokens.length; i++) { 
    // checking to see if token is a number
        if (tokens[i] >= '0' && tokens[i] <= '9') {
            StringBuffer num = new StringBuffer();
            // need to check if number is more than one digit long
            while ( i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
                num.append(tokens[i++]);
            number.push(Integer.parseInt(num.toString()));
        }
        else if (tokens[i] == '(')
            operator.push(tokens[i]);
        else if (tokens[i] == ')') {
            while (operator.peek() != '(') {
                holder = applyOp(operator.pop(), number.pop(), number.pop());
                number.push(holder);
            }
            operator.pop();
        }
        else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/') {
            // check for precedence
            while (!operator.empty() && hasPrecedence(tokens[i], operator.peek())) {
                holder = applyOp(operator.pop(), number.pop(), number.pop());
                number.push(holder);
            }
            operator.push(tokens[i]);
        }   
    } // end for loop

    while (!operator.empty()) {
        holder = applyOp(operator.pop(), number.pop(), number.pop());
        number.push(holder);
    }
    ans = number.pop();
    return ans;

} // end of evalExp

// checks to see which operand has a higher precedence if any
public static boolean hasPrecedence(char op1, char op2) {
    if (op2 == '(' || op2 == ')')
        return false;
    if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-'))
        return false;
    else
        return true;
} // end hasPrecedence


// return result of operator and operands
public static int applyOp(char op, int b, int a) {

    int ans = 0;

    switch (op) {
    case '+': ans = (a + b);
    //  return ans;
        break;
    case '-': ans = (a - b);
    //  return ans;
        break;
    case '*': ans = (a * b);
    //  return ans;
        break;
    case '/': ans = (a / b);
        if (b == 0)
            throw new ArithmeticException("Cannot divide by zero");
    //  return ans;
        break;
    }
    return ans;
} //end applyOp

} // конец класса Evaluate

1 Ответ

0 голосов
/ 02 июля 2018

Отладка того же самого дала бы вам ответ.

            while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
            {
                num.append(tokens[i++]);
            }

В этом коде, когда вы делаете i ++, вы увеличили значение i, но не обработали там символ, который является оператором в вашем случае использования.

            while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
            {
                num.append(tokens[i++]);
            }
            if (i != tokens.length)
                i--;

Возврат инкремента индекса устраняет эту проблему. Это может быть не правильным решением. Просто хотел показать влияние увеличенного индекса.

...