PS/Problems
[Java] 백준 1918번 후위 표기식 - 스택
CalicoCat22
2022. 1. 11. 22:15
https://mygumi.tistory.com/181
백준 1918번 후위표기식 :: 마이구미
이번 글은 백준 알고리즘 문제 1918번 "후위표기식" 을 다뤄본다. 자료구조 수업을 들어봤다면, 문제 제목을 보자마자, 스택을 활용하는 문제라는 걸 알 수 있다. 먼저 이론을 이해하고 푼다면, 쉬
mygumi.tistory.com
스택 구조를 활용해 중위 표기식을 후위 표기식으로 바꾸는 문제.
각 operator의 우선순위를 매겨, 스택에서 자신보다 우선순위가 낮은 것을 만날때까지 pop해서 붙이는 것은
생각도 못함...
package class4;
import java.util.*;
import java.io.*;
public class g3_1918{
public static void main(String[] args){
FastScanner fs = new FastScanner();
PrintWriter pw = new PrintWriter(System.out);
List<Character> sb = new LinkedList<>();
Stack<Character> st = new Stack<>();
String str = fs.next();
for (char c : str.toCharArray()){
switch (c){
case '+':
case '-':
case '*':
case '/':
int pri = prior(c);
while (!st.empty() && prior(st.peek()) >= pri){
sb.add(st.pop());
}
st.push(c);
break;
case '(':
st.push(c);
break;
case ')':
while (st.peek() != '('){
sb.add(st.pop());
}
st.pop();
break;
default:
sb.add(c);
break;
}
}
while (!st.empty()){
sb.add(st.pop());
}
for (Character cc : sb){
pw.print(cc);
}
pw.close();
}
static int prior(char c){
if (c == '*' || c == '/'){
return 2;
}
else if (c == '+' || c == '-'){
return 1;
}
// '(' ')'
return 0;
}
static void sort(int[] a){
ArrayList<Integer> L = new ArrayList<>();
for (int i : a) L.add(i);
Collections.sort(L);
for (int i = 0; i < a.length; i++) a[i] = L.get(i);
}
static class FastScanner{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer("");
String next(){
while (!st.hasMoreTokens()){
try{
st = new StringTokenizer(br.readLine());
}catch (IOException e){
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt(){
return Integer.parseInt(next());
}
int[] readArray(int n){
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = nextInt();
return a;
}
long nextLong(){
return Long.parseLong(next());
}
}
}