https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
문제
풀이
해당 문제는 스택으로 푼다.
1. 연산자를 만났을 경우
2. 피연산자를 만났을 경우
3. 괄호를 만났을 경우
로 크게 나눈다.
연산자를 만났을 경우 연산자들 간의 우선순위를 정하여 스택에 들어오려는 연산자가 더 클 경우 push하고 peek한 연산자가 더 클 경우 pop을 해준다.
피연산자를 만났을 경우 StringBuilderd에 바로 추가해준다.
괄호를 만났을 경우 '('면 push해주고 ')'면 '('나올때까지 pop을 해준다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class BOJ1918 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
String input = br.readLine();
for(int i=0;i<input.length();i++) {
char c = input.charAt(i);
switch(c) {
case '+' :
case '-' :
case '*' :
case '/' :
while(!stack.isEmpty() && prior(stack.peek()) >= prior(c)) {
sb.append(stack.pop());
}
stack.push(c);
break;
case '(' :
stack.push(c);
break;
case ')' :
while(!stack.isEmpty() && stack.peek()!='(') {
sb.append(stack.pop());
}
stack.pop();
break;
default :
// 피연산자일때
sb.append(c);
}
}
while(!stack.isEmpty()) {
sb.append(stack.pop());
}
System.out.println(sb);
}
public static int prior(char c) {
if(c=='(' || c==')') {
return 0;
}else if(c=='+'||c=='-') {
return 1;
}else if(c=='*'||c=='/'){
return 2;
}
return -1;
}
}
'코딩테스트' 카테고리의 다른 글
[BOJ_6588/JAVA] 골드바흐의 추측 (0) | 2021.12.30 |
---|---|
[BOJ_1929/JAVA] 소수 구하기 (0) | 2021.12.29 |
[BOJ_17299/JAVA] 오등큰수 (0) | 2021.12.27 |
[BOJ_17298/JAVA] 오큰수 (0) | 2021.12.19 |
[BOJ_9093/JAVA] 단어뒤집기 (0) | 2021.12.16 |