자료구조

[JAVA] 수식의 계산 - 전위표기법, 중위표기법, 후위표기법

갓생사는 김초원의 개발 블로그 2020. 10. 24. 00:38

수식 표현에는 3가지 방법이 있다. 

1. 전위표기법(prefix)

2. 중위표기법(postfix)  

3. 후위표기법(infix)

 

1. 전위 표기법(prefix)

- 연산자가 피연산자들 앞에 위치한 수식 

 

2. 중위 표기법(postfix)

- 연산자가 피연산자 사이에 위치한 수식

- 주로 사람이 계산하는 방법

 

3. 후위 표기법(infix)

- 연산자가 피연산자들 뒤에 위치한 수식

- 컴파일러가 계산하는 방법

 

[JAVA code] 중위표기법 -> 후위표기법 으로 변환 

/**
     * 중위 표기식 -> 후위 표기식
     *
     * @param expression
     * @return
     */
    public static String postfixToInfix(String expression) {
        String answer = "";
        Stack<String> stack = new Stack<>();
        String[] op = {"+", "-", "*", "/", "(", ")"};

        for (char c : expression.toCharArray()) {
            if (Arrays.asList(op).contains(c + "")) {

                if (c == ')') {
                    while (!stack.isEmpty() && stack.peek().charAt(0) != '(') {
                        answer += stack.pop().charAt(0);
                    }
                    stack.pop();

                } else {

                    while (!stack.isEmpty() && compareToOperation(c, stack.peek().charAt(0))) {
                        answer += stack.pop();
                    }
                    stack.push(c + "");
                }
            } else {
                answer += c;
            }
        }

        while (!stack.isEmpty()) {
            answer += stack.pop();
        }
        return answer;
    }
    
    public static boolean compareToOperation(char op1, char op2) {
        switch (op1) {
            case '+':
                if (op2 == '+' || op2 == '-' || op2 == '*' || op2 == '/') {
                    return true;
                }
            case '-':
                if (op2 == '-' || op2 == '+' || op2 == '*' || op2 == '/') {
                    return true;
                }
            case '*':
                if (op2 == '*' || op2 == '/') {
                    return true;
                }
            case '/':
                if (op2 == '*' || op2 == '/') {
                    return true;
                }
        }
        return false;
    }

 

 

[JAVA] 후위 표기법 계산 메서드

/**
     * 후위 표기식 계산 메서드
     *
     * @param expression
     * @return
     */
    public static int getInfixResult(String expression) {
        int answer = 0;
        String[] op = {"+", "-", "*", "/"};
        Stack<Integer> stack = new Stack<>();

        for (char c : expression.toCharArray()) {
            if (Arrays.asList(op).contains(c + "")) {
                int second = stack.pop();
                int first = stack.pop();

                switch (c) {
                    case '+':
                        stack.push(first + second);
                        break;
                    case '-':
                        stack.push(first - second);
                        break;
                    case '*':
                        stack.push(first * second);
                        break;
                    case '/':
                        stack.push(first / second);
                        break;
                }
            } else {
                stack.push(Integer.parseInt(c + ""));
            }
        }

        answer = stack.pop();
        return answer;
    }