Что я могу сделать для преобразования инфикса в префикс? - PullRequest
0 голосов
/ 06 ноября 2019

Я пишу этот блок кода для преобразования инфикса в префикс, но я не получаю никакого вывода, что я могу сделать?

, когда последний раз во время работы он попадает в бесконечный цикл, а условия if этого не делаютпроцесс в чем проблема?

 static String infixToPrefix(String infix){
        for (int j = 0; j < infix.length(); j++){
            if (infix.charAt(j) == 's' && infix.charAt(j + 1) == 'i' && infix.charAt(j + 2) == 'n'){
                infix = infix.replace("sin","S");
                break;
            }
            else if (infix.charAt(j) == 'c' && infix.charAt(j + 1) == 'o' && infix.charAt(j + 2) == 's' ){
                infix = infix.replace("cos", "C");
                break;
            }
            else if (infix.charAt(j) == 't' && infix.charAt(j + 1) == 'a' && infix.charAt(j + 2) == 'n' ) {
                infix = infix.replace("tan", "T");
                break;
            }
            else if (infix.charAt(j) == 'l' && infix.charAt(j + 1) == 'o' && infix.charAt(j + 2) == 'g' ) {
                infix = infix.replace("log", "L");
                break;
            }
        }
        Stack<String> operators = new Stack<>();
        Stack<String> operands = new Stack<>();
        String[] exp = infix.split("");
        for (int i = 0; i < exp.length; i++) {
            if (exp[i].equals("(")) {
                operators.push(exp[i]);
            }
            else if (exp[i].equals(")")) {
                while (!operators.isEmpty() && !operators.getTop().equals("(")) {
                    if (isMultiOperator(operators.getTop())){
                        String op1 = operands.getTop();
                        operands.pop();

                        String op2 = operands.getTop();
                        operands.pop();

                        String op3 = operators.getTop();
                        operators.pop();

                        String temp = op3 + op2 + op1;
                        operands.push(temp);
                    }
                    else if(isUnaryOperator(operators.getTop())){
                        String op1 = operands.getTop();
                        operands.pop();

                        String op2 = operators.getTop();
                        operators.pop();

                        String temp = op2 + op1;
                        operands.push(temp);
                    }
                }
                operators.pop();
            }
            else if (isMultiOperator(exp[i]) || isUnaryOperator(exp[i])){

                while (!(operators.isEmpty()) && precedence(exp[i]) <= precedence(operators.getTop())) {

                    if (isMultiOperator(operators.getTop())){
                        String op1 = operands.getTop();
                        operands.pop();

                        String op2 = operands.getTop();
                        operands.pop();

                        String op3 = operators.getTop();
                        operators.pop();

                        String temp = op3 + op2 + op1;
                        operands.push(temp);
                    }
                    else if (isUnaryOperator(operators.getTop())){
                        String op1 = operands.getTop();
                        operands.pop();

                        String op2 = operators.getTop();
                        operators.pop();

                        String temp = op2 + op1;
                    }
                }
                operators.push(exp[i] + " ");
            }
            else if (Character.isLetterOrDigit(infix.charAt(i))){
                boolean haveDot = exp[i].equals(".");
                String temp = haveDot ? "0." : exp[i];
                while ((i + 1) < exp.length && (Character.isLetterOrDigit(infix.charAt(i + 1)) || exp[i + 1].equals("."))) {
                    temp += exp[i + 1];
                    i++;
                }
                operands.push(temp + " ");
            }
        }
        while (!operators.isEmpty()){
            if (isMultiOperator(operators.getTop())){
                String op1 = operands.getTop();
                operands.pop();

                String op2 = operands.getTop();
                operands.pop();

                String op3 = operators.getTop();
                operators.pop();

                String temp = op3 + op2 + op1;
                operands.push(temp);
            }
            else if (isUnaryOperator(operators.getTop())){
                String op1 = operands.getTop();
                operands.pop();

                String op2 = operators.getTop();
                operators.pop();

                String temp = op2 + op1;
                operands.push(temp);
            }
        }
        return operands.getTop() ;
    }

Я пишу этот блок кода для преобразования инфикса в префикс, но у меня нет вывода, что я могу сделать? когда последний во время работы попадает в бесконечный цикл и условия if не обрабатываются, в чем проблема?

...