후위 표현식

후위 표현식을 만들기 위해서는 연산자의 순서 우선순위를 알아두면 좋다

3가지로 구분해서 외우면 편할거 같은데

icp 연산에서 ( 는 우선순위가 3이라 가장 높다 따라서 ( 들어갈때는 무조건 스택에 쌓으면 된다

다음 *, / 연산은 *,/ 만났을때만 꺼내고 나머지는 쌓는다

+,- 연산은 *,/,+,- 만났을때 꺼내고 나머지는 쌓는다

) 는 ( 만날때 까지 꺼내고 만약  stack[top]==( 면 ( 삭제하기 위해서  top을 한번더 빼준다.

마지막으로는 스택에 남은 모든 값들을 출력해주면 후위표현식이 만들어 진다.


* 진짜 개 꿀팁 -

후위 표현식을 만들고 계산을 해야하는데 나오는 값을 다른 배열에 넣지말고 

String a ="";

이런 문자열 하나 만들어서 그 뒤에 계속 문자열로 붙여주면 진짜 쉽게 만들 수 있다



/**
* 계산기 : 중위표현식 => 후위 표현식으로 변환해서 출력
* icp : in-coming priority
*
* isp : in-stack priority
*
* 숫자가 클수록 우선순위가 높다
*
* 토큰 isp icp 비교 ) ( 나올때 까지 꺼냄 * / 2 2 + - 1 1 ( 0 0 스택에 무조건 넣기
*
* input 피연산자, 연산자 합쳐서 13개 입력 ( 6 + 5 * ( 2 - 8 ) / 2 )
*
* output 6 5 2 8 - * 2 / +
*
*/


public class 후위연산만들기 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] stack = new char[20]; //연산자만 저장
        int top=-1;
        String[] str = sc.nextLine().split(" ");
        
        
        for(int i=0; i<str.length; i++) {
            char c =str[i].charAt(0);
            
            switch(c) {
            
            case '(': //들어가는 ( 괄호는 우선순위가 3이라 잴 높다 그래서 무조건 스택에 쌓는다
                stack[++top]=c;
                break;
            case '*': // *, / 는 우선순위가 2이다 스택에 나보다 우선순위가 작은것이 남아있을때 까지 출력한다
            case '/': // 여기서 *, / 보다 우선순위가 같거나 높은 경우는 *,/ 밖에 없다 그건 꺼내고 나머지는 쌓는다
                while(top>-1 &&(stack[top]== '*' || stack[top]=='/')) {
                    System.out.print(stack[top]+" ");
                    top--; //꺼낸다
                }
                stack[++top]=c;
                break;
                
            case '+': // + - 보다 우선순위가 낮은 경우는 없기 때문에 다 출력한다
            case '-':
                while(top>-1 && (stack[top]=='*' || stack[top]=='/' || stack[top]=='+' || stack[top]=='-')) {
                    System.out.print(stack[top]+" ");
                    top--;
                }
                
                stack[++top]=c;
                break;
            case ')': // ( 만날때 까지 출력한다.
                while(top > -1 && stack[top]!='(') {
                    System.out.print(stack[top]+" ");
                    top--;
                }
                if(stack[top]=='(') {
                    top--;
                }
                break;
            default:
                System.out.print(str[i]+" ");
                break;
            }

        }
        
        while(top > -1) {
            System.out.println(stack[top--]+" ");
        }
        
    }
}








'알고리즘' 카테고리의 다른 글

BufferedReader 로 입출력 속도 단축하기  (0) 2019.01.23
Queue -java  (0) 2019.01.23
후위 표현식 계산하기  (0) 2019.01.22

+ Recent posts