algorithm

후위식 연산(postfix)

juuuuuuun 2024. 5. 24. 17:51

설명

후위연산식이 주어지면 연산한 결과를 출력하는 프로그램을 작성하세요.

만약 3*(5+2)-9 을 후위연산식으로 표현하면 352+*9- 로 표현되며 그 결과는 12입니다.

 

입력

첫 줄에 후위연산식이 주어집니다. 연산식의 길이는 50을 넘지 않습니다.

식은 1~9의 숫자와 +, -, *, / 연산자로만 이루어진다.

 

출력

연산한 결과를 출력합니다.

예시 입력 1 

352+*9-

 

예시 출력 1

12

 

소스 코드 1

import java.util.Scanner;
import java.util.Stack;
//후위식 연산
public class Main {
    public static int solution(String str) {
        int ans=0;
        Stack<Integer> stack = new Stack<>();

        for (Character x : str.toCharArray()) {
            if ('0' <= x && x <= '9') { //숫자라면 스택에 추가
                stack.push(x - '0');
            } else { // 연산자 일시
                if (stack.size() >= 2) { //숫자가 2개 이상 있어야 연산이 가능함
                    int sum = 0;
                    switch (x) {
                        case '+':
                            sum = stack.get(stack.size() - 2) + (stack.get(stack.size() - 1));
                            stack.pop();
                            stack.pop();
                            stack.push(sum);
                            break;
                        case '-':
                            sum = stack.get(stack.size() - 2) - stack.get(stack.size() - 1);
                            stack.pop();
                            stack.pop();
                            stack.push(sum);
                            break;
                        case '*':
                            sum = stack.get(stack.size() - 2)  * (stack.get(stack.size() - 1));
                            stack.pop();
                            stack.pop();
                            stack.push(sum);
                            break;
                        case '/':
                            sum = stack.get(stack.size() - 2)  / stack.get(stack.size() - 1);
                            stack.push(sum);
                            stack.pop();
                            stack.pop();
                            break;
                    }
                }
            }
        }
        ans = stack.get(0);
        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));
    }
}

 

 

소스 코드 2

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

//후위식 연산 다른풀이
public class Main {
    public static int solution(String str) {
        int ans=0;
        Stack<Integer> stack = new Stack<>();

        for (Character x : str.toCharArray()) {
            if (Character.isDigit(x)) { //숫자라면 스택에 추가
                stack.push(x - '0');
            } else { // 연산자 일시
                if (stack.size() >= 2) { //숫자가 2개 이상 있어야 연산이 가능함
                    int lt = 0; //스택 맨 위에서 2번째 숫자 저장
                    int rt = 0; //스택 맨 위의 숫자 저장
                    switch (x) {
                        case '+':
                            rt = stack.pop();
                            lt = stack.pop();
                            stack.push(lt + rt);
                            break;
                        case '-':
                            rt = stack.pop();
                            lt = stack.pop();
                            stack.push(lt - rt);
                            break;
                        case '*':
                            rt = stack.pop();
                            lt = stack.pop();
                            stack.push(lt * rt);
                            break;
                        case '/':
                            rt = stack.pop();
                            lt = stack.pop();
                            stack.push(lt / rt);
                            break;
                    }
                }
            }
        }
        ans = stack.get(0);
        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));
    }
}

 

Character.isDigit(x)

 - char형 데이터가 숫자라면 true 리턴