Ошибка выполнения - ArrayIndextOutofBoundException - 96 - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь создать простой калькулятор с использованием стека, но мой код работает только для строки размером 3, в противном случае он показывает ошибку из-за исключенного исключения.

Я пытался измениться в строке 42, я думаю, что проблема там, но я не уверен, было бы замечательно, если бы кто-то помог мне.

Мой основной метод заканчивается примером, я даже пробовал другой пример «3», +, «5», который на самом деле работает для меня, но когда я увеличиваю размер моего строкового массива или ввода, онпоказывает мне ввод границы кроме строки 96.

import java.util.Stack;

public class SimpleCalculator {

static int precedence(char c){
    switch (c){
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        case '^':
            return 3;
    }
    return -1;
}
public static int evaluate(int s1, int s2, char operator){
    switch (operator) {
        case '+':
            return  (s1 + s2);
        case '-':
            return  (s2 - s1);
        case '*':
            return  (s1 * s2);
        case '/':
            if (s1 == 0)
                throw new
                        UnsupportedOperationException("Cannot divide by zero");
            return (s2 / s1);
    }
    return 0;
}

static String[] infixToPostFix(String[] exp){

    String[] result = { };
    String result1 =" ";
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i <exp.length ; i++) {
        String a = exp[i];
        char c = a.charAt(0); //42
        if(precedence(c)>0){
            while(stack.isEmpty()==false && precedence(stack.peek())>=precedence(c)){
                result1 += stack.pop();
            }
            stack.push(c);
        }else if(c==')'){
             c = stack.pop();
            while(c!='('){
                result1 += c;
                c = stack.pop();
            }
        }else if(c=='('){
            stack.push(c);
        }else{
            result1 += c;
        }
    }
    for (int i = 0; i <=stack.size() ; i++) {
        result1 += stack.pop();
    }
 result =result1.split("");
    return result;
}
public static int postfixEvaluation(String[] exp) {

    Stack<Integer> stack = new Stack<>();
    for (int i = 0; i < exp.length; i++) {
        String a = exp[i];
        char c = a.charAt(0);
        if (c == '*' || c == '/' || c == '^' || c == '+' || c == '-') {
            int s1=stack.peek();
            int s2=stack.peek();
            int temp = evaluate(s1, s2, c);
            stack.push(temp);
        } else {
            stack.push((c-'0'));
        }
    }

    int result = stack.pop();
    return result;
}

public static void main(String[] args) {
    String[] exp = {"3","+","5","+","8","(",")"};
    System.out.print("Infix Expression: ");
    int j = exp.length + 1 ;
    for (int i = 0; i<exp.length ; i++) {
    System.out.print(exp[i]);
    }
    System.out.println();
    System.out.print("Postfix Expression: ");
    for (int i = 0; i<j ; i++) {
         System.out.print(infixToPostFix(exp)[i]); //96
      }
     System.out.println();
    System.out.println(" Postfix Evaluation: " + postfixEvaluation(exp));
    }
}

1 Ответ

0 голосов
/ 13 октября 2019

Похоже, что ваша функция infixToPostfix удаляет круглые скобки, это важно, потому что вы перебираете длину исходного массива + 1, который включает в себя круглые скобки.

Возможно, вам потребуется выполнить итерацию результата с ожидаемой вами длиной, иначе ваш метод infixToPostfix может иметь ошибку.

Вот код, который я использовал, чтобы найти проблему (также в этом примере я повторяю исходную длину - 1):

import java.util.Stack;

public class SimpleCalculator {

    static int precedence(char c) {
        switch (c) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            case '^':
                return 3;
        }
        return -1;
    }

    public static int evaluate(int s1, int s2, char operator) {
        switch (operator) {
            case '+':
                return (s1 + s2);
            case '-':
                return (s2 - s1);
            case '*':
                return (s1 * s2);
            case '/':
                if (s1 == 0)
                    throw new
                            UnsupportedOperationException("Cannot divide by zero");
                return (s2 / s1);
        }
        return 0;
    }

    static String[] infixToPostFix(String[] exp) {

        String[] result = {};
        String result1 = " ";
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < exp.length; i++) {
            String a = exp[i];
            char c = a.charAt(0); //42
            if (precedence(c) > 0) {
                while (stack.isEmpty() == false && precedence(stack.peek()) >= precedence(c)) {
                    result1 += stack.pop();
                }
                stack.push(c);
            } else if (c == ')') {
                c = stack.pop();
                while (c != '(') {
                    result1 += c;
                    c = stack.pop();
                }
            } else if (c == '(') {
                stack.push(c);
            } else {
                result1 += c;
            }
        }
        for (int i = 0; i <= stack.size(); i++) {
            result1 += stack.pop();
        }
        result = result1.split("");
        return result;
    }

    public static int postfixEvaluation(String[] exp) {

        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < exp.length; i++) {
            String a = exp[i];
            char c = a.charAt(0);
            if (c == '*' || c == '/' || c == '^' || c == '+' || c == '-') {
                int s1 = stack.peek();
                int s2 = stack.peek();
                int temp = evaluate(s1, s2, c);
                stack.push(temp);
            } else {
                stack.push((c - '0'));
            }
        }

        int result = stack.pop();
        return result;
    }

    public static void main(String[] args) {
        String[] exp = {"3", "+", "5", "+", "8", "(", ")"};
        System.out.print("Infix Expression: ");
        int j = exp.length - 1;
        for (int i = 0; i < exp.length; i++) {
            System.out.print(exp[i]);
        }
        System.out.println();
        System.out.print("Postfix Expression: ");
        for (int i = 0; i < j; i++) {
            System.out.println(String.format("Result of infix [%s]", arrayToString(infixToPostFix(exp))));
            System.out.println(String.format("Infix result length [%d]", infixToPostFix(exp).length));
            System.out.println(infixToPostFix(exp)[i]); //96
        }
        System.out.println();
        System.out.println(" Postfix Evaluation: " + postfixEvaluation(exp));
    }


    static String arrayToString(String[] val) {
        StringBuilder sb = new StringBuilder();
        for (String s : val) {
            sb.append(s);
        }
        return sb.toString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...