문제 출저
https://www.acmicpc.net/problem/1918
문제 풀이
중위 표기식을 후위 표기식으로 바꾸는 문제입니다.
Stack을 사용하여 문제를 풀었습니다. Stack operation을 선언하여 기호들을 저장했습니다.
StringBuilder sb를 선언하여 후위 표기식을 저장했습니다.
1. 알파밧이 나오면 그대로 sb에 저장합니다.
2. ( 연산자가 나오면 operation에 저장합니다.
3. ) 연산자가 나오면 operation에서 ( 가 나올 때까지 꺼내 sb에 저장합니다. ( 은 저장하지 않습니다.
4. +, -, *, / 연산자가 나오면 operation에서 자신보다 우선 수위가 같거나 낮은 것을 전부 꺼내 sb에 저장합니다.
우선 순위 : * = / > + = -
예시 : A+B+C -> AB+C+
이 문제는 차량기지 알고리즘을 이해하시면 문제 풀이에 도움이 됩니다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String order = br.readLine();
StringBuilder sb = new StringBuilder();
Stack<Character> operation = new Stack<>();
for(int i = 0; i < order.length(); i++) {
char c = order.charAt(i);
if(Character.isAlphabetic(c)) {
sb.append(order.charAt(i));
}
else {
if(c == '(') {
operation.add(c);
}
else if(c == ')') {
while(!operation.isEmpty()) {
if(operation.peek() == '(') {
operation.pop();
break;
}
sb.append(operation.pop());
}
}
else if(c == '*' || c == '/') {
while(!operation.isEmpty()) {
if(operation.peek() == '(' || operation.peek() == ')') break;
if(operation.peek() == '+' || operation.peek() == '-') break;
if(operation.peek() == '*' || operation.peek() == '/') sb.append(operation.pop());
}
operation.add(c);
}
else if(c == '+' || c == '-') {
while(!operation.isEmpty()) {
if(operation.peek() == '(' || operation.peek() == ')') break;
sb.append(operation.pop());
}
operation.add(c);
}
}
}
while (!operation.isEmpty()) {
sb.append(operation.pop());
}
System.out.println(sb);
}
}