[java] 스택을 이용한 수식의 중위 표기법 변환하기

수식의 중위 표기법을 후위 표기법으로 바꾸기 위해서 스택을 사용할 수 있습니다. 중위 표기법은 연산자가 피연산자 사이에 위치하는 표기법이며, 후위 표기법은 연산자가 피연산자 뒤에 위치하는 표기법입니다.

문제

예를 들어, 다음과 같은 중위 표기법 수식을 고려해보겠습니다.

3 + 4 * 2 / ( 1 - 5 ) ^ 2

이 수식을 후위 표기법으로 변환하면 다음과 같습니다.

3 4 2 * 1 5 - 2 ^ / +

해결 방법

중위 표기법을 후위 표기법으로 바꾸기 위해서 스택을 사용합니다. 알고리즘은 다음과 같습니다.

  1. 피연산자는 그대로 결과에 추가합니다.
  2. ’(‘를 만나면 스택에 push합니다.
  3. ’)’를 만나면 스택의 top에 있는 연산자를 결과에 추가하고 pop합니다. ‘(‘를 만날 때까지 이 과정을 반복합니다.
  4. 연산자를 만나면 스택의 top에 있는 연산자와 우선순위를 비교합니다. 스택의 top에 있는 연산자가 현재 연산자보다 우선순위가 높으면 결과에 추가하고 pop합니다. 현재 연산자보다 우선순위가 낮거나 같은 연산자를 만날 때까지 이 과정을 반복합니다.
  5. 모든 수식을 확인한 후에 스택에 남아있는 모든 연산자를 결과에 추가합니다.

아래는 위 알고리즘을 Java로 구현한 코드 예시입니다.

import java.util.Stack;

public class InfixToPostfix {
    public static String convertToPostfix(String expression) {
        String postfix = "";
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                postfix += ch;
            } else if (ch == '(') {
                stack.push(ch);
            } else if (ch == ')') {
                while (!stack.isEmpty() && stack.peek() != '(') {
                    postfix += stack.pop();
                }
                stack.pop();
            } else {
                while (!stack.isEmpty() && precedence(ch) <= precedence(stack.peek())) {
                    postfix += stack.pop();
                }
                stack.push(ch);
            }
        }

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

        return postfix;
    }

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

    public static void main(String[] args) {
        String infix = "3 + 4 * 2 / ( 1 - 5 ) ^ 2";
        String postfix = convertToPostfix(infix);
        System.out.println("Infix expression: " + infix);
        System.out.println("Postfix expression: " + postfix);
    }
}

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Infix expression: 3 + 4 * 2 / ( 1 - 5 ) ^ 2
Postfix expression: 342*15-2^/+

결론

스택을 사용하여 중위 표기법을 후위 표기법으로 변환하는 방법을 살펴보았습니다. 중위 표기법과 후위 표기법을 변환하는 알고리즘은 다양한 응용 분야에서 유용하게 사용될 수 있습니다.