문제설명
소스코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static int priority(char operator)
{
if (operator == '+' || operator == '-') return 1;
if (operator == '*' || operator == '/') return 2;
return 0;
}
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Character> stack = new Stack<>();
String prefix = br.readLine();
StringBuilder postfix = new StringBuilder();
for (int i = 0; i < prefix.length(); ++i)
{
char ch = prefix.charAt(i);
if (ch == '(') stack.push(ch);
else if (ch == ')')
{
while (!stack.isEmpty() && stack.peek() != '(') postfix.append(stack.pop());
stack.pop(); // Pop '('
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
while (!stack.isEmpty() && priority(ch) <= priority(stack.peek())) postfix.append(stack.pop());
stack.push(ch);
}
else postfix.append(ch);
}
while (!stack.isEmpty()) postfix.append(stack.pop());
System.out.print(postfix.toString());
}
}
설명
- priority(char operator) 메소드 : 연산자의 우선순위를 반환하는 메소드. '*'와 '/' 연산자의 우선순위가 높고, '+'와 '-' 연산자의 우선순위가 낮다.
- 중위 표현식(prefix)을 받아와 후위 표현식으로 변환.
이때 스택을 사용하여 연산자들을 임시로 저장한다.
코드의 실행 흐름은 다음과 같다. - 문자열을 한 글자씩 읽어가면서 처리한다.
- '(' 괄호를 만나면 스택에 푸시
- ')' 괄호를 만나면 '(' 괄호가 나올 때까지 스택에서 연산자를 pop하여 postfix에 추가, 이후 '(' 괄호를 스택에서 제거.
- 연산자를 만날경우
3-1. 스택의 맨 위에 있는 연산자보다 현재 연산자보다 우선순위가 낮거나 같은 경우, 우선순위가 높은 연산자를 만날 때까지 스택에서 pop하여 postfix에 추가. 이후 현재 연산자를 스택에 푸시.
3-2. 스택의 맨 위에 있는 연산자보다 현재 연산자가 우선순위가 높은 경우, 스택에 현재 연산자를 push - 피연산자를 만나면 바로 postfix에 추가.
- 참고로 예제는 다 맞았지만 틀렸다고 나오는 경우, G*(A-B*(C/D+E)/F)를 입력했을 때 GABCD/E+*F/-*가 출력되는지 확인해보는 것이 좋다.
(A+(BXC-D)+E)-(F+G)/H
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[Java] 백준 1927번 문제 (최소 힙) (0) | 2023.10.22 |
---|---|
[Java] 백준 1673번 문제 (치킨 쿠폰) (0) | 2023.10.19 |
[Java] 백준 1935번 문제 (후위 표기식2) (0) | 2023.10.17 |
[Java] 백준 11869번 문제 (님블) (1) | 2023.10.05 |
[Java] 백준 11868번 문제 (님 게임2) (1) | 2023.10.05 |