본문 바로가기

알고리즘/백준

[백준] 1918번 후위표기식

반응형

1918번 후위표기식

1. 이해하기

  • 중위 표기식을 후위 표기식으로 바꾸는 문제.
  • 스택을 어떻게 사용하는지 알아야 하는 문제이다.

2. 구현하기

  • 현재 값이 알파벳이라면 출력하는 배열에 넣어준다.
  • 현재 값이 +,- 라면 ( 이외의 연산자는 모두 빼고 출력하는 배열에 넣어준다. 그 이후 스택의 가장 윗부분에 현재 값을 넣어준다.
  • 현재 값이 *,/ 라면 +,-,( 이외의 연산자는 모두 빼어 출력하는 배열에 넣어준다. 이후, 스택의 가장 윗부분에 현재 값을 넣어준다.
  • 현재 값이 ( 라면 스택의 가장 윗부분에 넣는다.
  • 현재 값이 ) 라면 ( 이 나올 때까지 빼어 출력하는 배열에 넣어준 후, (를 빼버린다.
package algo;

import java.util.Scanner;

public class Acm1918_후위표기식 {
    static char[] stk1;
    static char[] stk2;
    static int stk1Idx = -1;
    static int stk2Idx = -1;
    static String str;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        str = sc.next();
        stk1 = new char[110];
        stk2 = new char[110];

        for(int i = 0; i < str.length(); i++) {
            char here = str.charAt(i);
            if('A' <= here && here <= 'Z') {
                stk1[++stk1Idx] = here;
            } else {
                if(here == '+' || here == '-') {
                    while(stk2Idx >= 0 && stk2[stk2Idx] != '(') {
                        stk1[++stk1Idx] = stk2[stk2Idx];
                        --stk2Idx;
                    }
                    stk2[++stk2Idx] = here;
                } else if(here == '*' || here == '/') {
                    while(stk2Idx >= 0 && stk2[stk2Idx] != '(' && stk2[stk2Idx] != '+' && stk2[stk2Idx] != '-') {
                        stk1[++stk1Idx] = stk2[stk2Idx];
                        --stk2Idx;
                    }
                    stk2[++stk2Idx] = here;
                } else if(here == '(') {
                    stk2[++stk2Idx] = here;
                } else if(here == ')') {
                    while(stk2Idx >= 0 && stk2[stk2Idx] != '(') {
                        stk1[++stk1Idx] = stk2[stk2Idx--];
                    }
                    stk2Idx--;
                }
            }
        }
        while(stk2Idx >= 0) {
            stk1[++stk1Idx] = stk2[stk2Idx--];
        }
        for(int i = 0; i <= stk1Idx; i++) {
            System.out.print(stk1[i]);
        }
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2660번 회장뽑기  (0) 2020.02.13
[백준] 1248번 맞춰봐  (0) 2020.02.13
[백준] 17070번 파이프 옮기기1  (0) 2020.02.08
[백준] 16637번 괄호 추가하기  (0) 2020.02.08
[백준] 9935번 문자열 폭발  (0) 2020.02.06