백준 1918 - 후위 표기식
Updated:
Java
1918 번 - 후위 표기식
문제
접근 방법
- 피연산자를 만나면 바로 출력한다.
- 연산자를 만났으며, 스택이 비어있으면 push 한다.
- 스택에 이미 연산자가 있을 때 a. 현재(스택에 넣으려는) 연산자 우선순위 > 스택의 연산자 우선순위 스택에 push b. 현재 연산자 우선순위 <= 스택의 연산자 우선순위 현재 연산자 우선순위 > 스택의 연산자 우선순위 될때까지 스택의 연산자를 pop한 후, 현재 연산자 push
- 문자열의 마지막을 만나면 스택을 차례로 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);
}
}