갓생사는 김초원의 개발 블로그
chocho_log
갓생사는 김초원의 개발 블로그
전체 방문자
오늘
어제
  • 분류 전체보기 (76)
    • 개발 (22)
      • Spring (4)
      • Java (3)
      • Database (2)
      • Elasticsearch (3)
      • ETC (3)
      • JPA (3)
      • 이슈 (1)
    • 코딩 테스트 (43)
      • 프로그래머스 (23)
      • 백준 (12)
      • TIP (8)
    • 자료구조 (2)
    • 알고리즘 (4)
    • 잡생각 (0)
    • 경험 (3)
      • AWS re:Invent 2024 (3)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Lazy Loading
    • jar
    • jpa
    • 지연로딩
    • 디자인패턴 #SOLID 원칙
    • war
    • querydsl
    • Spring Boot Embedded Tomcat

    최근 댓글

    최근 글

    갓생사는 김초원의 개발 블로그

    chocho_log

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

    [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;
        }

    '자료구조' 카테고리의 다른 글

    이진 탐색 트리(Binary Search Tree)개념 및 Java 구현  (0) 2021.02.27
      '자료구조' 카테고리의 다른 글
      • 이진 탐색 트리(Binary Search Tree)개념 및 Java 구현
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그 github: https://github.com/kimchowon

      티스토리툴바