알고리즘

백준 1935 - 후위 표기식

스파이더웹 2022. 7. 27. 00:01
728x90
반응형

후위 표기식 문제이다 후위 표기식이란 연산자가 피연산자 뒤의 위치하는 것을 의미한다

Stack을 활용한다

이제 문제를 살펴보자

문제에서 후위표기식 문자열이 주어지는데 문자열 중 알파벳은 주어지는 숫자와 1:1 매핑관계이다

그러므로 문제에서는 A일 경우 숫자 1을 스택에 넣어주면된다

 

연산자일 경우 스택에 넣은 값을 끄내 해당연산을 시행한후 값을 다시 스택에 넣어준다

결과 값을 또 다른연산을 만났을경우 계산을 반복하면된다

 

import java.util.Scanner;
import java.util.Stack;

public class C {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String str = scanner.next();
        double[] arr = new double[n];

        Stack<Double> st = new Stack<>();


        for(int i=0; i<n; i++){
            arr[i] = scanner.nextDouble();
        }

        for(int i=0; i<str.length(); i++){
            if(Character.isAlphabetic(str.charAt(i))){
                st.push(arr[str.charAt(i) - 'A']);//알파벳에 해당하는 아스키코드 - 65를하여 배열 arr[인덱스]번호를 확인할 수 있다
            }else if(str.charAt(i)=='+'){
                double temp1 = st.pop();//마지막 앞전에 넣은 숫자를 끄내온다
                double temp2 = st.pop();//마지막에 넣은 숫자를 끄내온다
                double temp3 = temp2 + temp1; //계산한다
                st.push(temp3);//결과 값을 스택어 넣어준다 반복한다
            }else if(str.charAt(i)=='-'){
                double temp1 = st.pop();
                double temp2 = st.pop();
                double temp3 = temp2 - temp1;
                st.push(temp3);
            }else if(str.charAt(i)=='/'){
                double temp1 = st.pop();
                double temp2 = st.pop();
                double temp3 = temp2 / temp1;
                st.push(temp3);
            }else if(str.charAt(i)=='*'){
                double temp1 = st.pop();
                double temp2 = st.pop();
                double temp3 = temp2 * temp1;
                st.push(temp3);
            }
        }
        System.out.printf("%.2f",st.pop());
    }
}

결과 
6.20
728x90
반응형