Операторы неуместны в выводе постфиксной записи инфиксного выражения, заданного в виде строки - PullRequest
0 голосов
/ 18 сентября 2018

Вот код Java, который принимает в качестве входной строки выражения инфикс с несколькими уровнями фигурных скобок и смешивает операнды и выходные данные в виде одного длинного выражения постфикса.

Я преобразовал нотацию инфиксной строки в постфикс, потому что я хотелустранить все скобки и уважать операторские приоритеты.Брейс, деление, умножение, сложение и вычитание.

Эта программа не работает должным образом.Например, вывод:

"9 + 3 / 4- (4/2) * (3+ (5-2 ^ 2))"

долженbe

9 3 4 / + 4 2/3 5 2 2 ^ - + * -

(по данным этого сайта)

но дает мне:

934 / + 42 / * 3522 ^ - + -

Почему этот ошибочный вывод?Возможно ли найти проблему?

import java.util.ArrayList;
import java.util.Stack;

class infixToPostfix{

    Stack<String> stack;
    ArrayList<String> operators;

    String postFix;

    int[] operand = {-1, -1, 1};
    int[] plusorminus = {1,2,-1};
    int[] timesordivide = {3,4,-1};
    int[] raiseto = {6,5,-1};
    int[] openparenthesis = {-1,0,-1};

    public infixToPostfix(String infix) {

        stack = new Stack<String>();
        operators = new ArrayList<String>();

        operators.add("+");
        operators.add("-");
        operators.add("x");
        operators.add("/");
        operators.add("^");
        operators.add("(");
        operators.add(")");

        postFix = new String();

        while(infix.length() > 0){

            String operand = new String();
            String operator = new String();

            if(!operators.contains(infix.substring(0, 1))){
                while(!operators.contains(infix.substring(0, 1)) && !infix.isEmpty()){
                    operand = infix.substring(0,1);
                    infix = infix.substring(1);
                }
                postFix = postFix + operand;
            }
            else if(operators.get(5).equals(infix.substring(0, 1))){
                stack.push(infix.substring(0, 1));
                infix = infix.substring(1);
            }
            else if(operators.get(6).equals(infix.substring(0, 1))){
                while(!stack.peek().equals("(")){
                    postFix = postFix + stack.pop();
                }
                stack.pop();
                infix = infix.substring(1);
            }
            else{
                operator = infix.substring(0,1);

                int[] current = getICPandISP(operator);

                if(!stack.isEmpty()){
                    int[] top = getICPandISP(stack.peek());
                    while(current[0] < top[1] && !stack.isEmpty()){
                        postFix = postFix + stack.pop();
                        if(!stack.isEmpty())
                            top = getICPandISP(stack.peek());
                    }
                }
                stack.push(operator);
                infix = infix.substring(1);
            }
        }
        postFix = postFix + infix;

        while(!stack.isEmpty()){
            postFix = postFix + stack.pop();
        }
    }

    public String toString(){
        return postFix;
    }

    private int[] getICPandISP(String operator){
        if(operator.equals("+") || operator.equals("-")){
            return plusorminus;
        }
        else if(operator.equals("*") || operator.equals("/")){
            return timesordivide;
        }
        else if(operator.equals("^")){
            return raiseto;
        }
        else{
            return openparenthesis;
        }
    }

    public static void main(String[] args){
        infixToPostfix convert = new infixToPostfix("9+3/4-(4/2)*(3+(5-2^2))");
                //"A+B/C-(A/D)*(A+(C-E^F))");
        System.out.println(convert);
    }

}

Вывод:

934 / + 42 / * 3522 ^ - + -

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы обеспокоены тем, что на выходе нет пробелов (если у вас есть многозначное значение, такое как «42», вы не узнаете по выходу, было ли это «42» или «4 2»)затем вставьте пробелы при построении строки postFix:

Измените:

postFix = postFix + stack.pop()

на:

postFix = postFix + " " + stack.pop()

(встречается в нескольких местах - может быть полезнорефакторинг в свой метод.)

0 голосов
/ 19 сентября 2018

Нашел мое решение.Вот.патч diff должен быть следующим:

- operator.add ("x");

+ operator.add ("*");

...