백준 1918 - 후위 표기식

Updated:

Java

1918 번 - 후위 표기식

문제

접근 방법

  1. 피연산자를 만나면 바로 출력한다.
  2. 연산자를 만났으며, 스택이 비어있으면 push 한다.
  3. 스택에 이미 연산자가 있을 때 a. 현재(스택에 넣으려는) 연산자 우선순위 > 스택의 연산자 우선순위 스택에 push b. 현재 연산자 우선순위 <= 스택의 연산자 우선순위 현재 연산자 우선순위 > 스택의 연산자 우선순위 될때까지 스택의 연산자를 pop한 후, 현재 연산자 push
  4. 문자열의 마지막을 만나면 스택을 차례로 pop

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		char[] input = str.toCharArray();
		int size = str.length();
		StringBuilder sb = new StringBuilder();

		char curC;
		Stack<Character> oper = new Stack<>();
		for(int i = 0; i < size; i++) {
			curC = input[i];

			// 피연산자일 경우
			if('A' <= curC && curC <= 'Z')
				sb.append(curC);
			// 연산자일 경우
			else {
				if(curC == '(') {
					oper.add(curC);
				}
				else if(curC == ')') {
					while(oper.peek() != '(') {
						sb.append(oper.pop());
					}
					oper.pop();
				}
				else {
					// 그냥 집어 넣는 경우
					if(oper.isEmpty()) {
						oper.add(curC);
					}
					else {
						while(!oper.isEmpty() && comp(curC, oper.peek())) {
							sb.append(oper.pop());
						}
						oper.add(curC);
					}
				}
			}
		}
		while(!oper.isEmpty()) {
			sb.append(oper.pop());
		}

		System.out.println(sb.toString());
    	br.close();
	}
	// false는 stack에 넣는다.
	// true는 stack의 값을 빼고 자신이 들어감
	static boolean comp(char toStack, char inStack) {
		if(toStack == '*' || toStack == '/') {
			if(inStack == '*' || inStack == '/')
				return true;
			else
				return false;
		}
		// 넣을 연산자가 + or -
		else {
			if(inStack == '(')
				return false;
			else
				return true;
		}
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점