728x90
https://www.acmicpc.net/problem/1918
package BaekJoon.Stack;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class 후위표기식_1918 {
public static int findlevel(char c) {
if(c=='-'||c=='+') {return 1;}
else if(c=='*'||c=='/') {return 2;}
return -1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<Character>st = new Stack<>();
ArrayDeque<Character>dq = new ArrayDeque<>();
Queue<Integer>q = new LinkedList<Integer>();
for(int i=0; i<str.length();i++) {
char c = str.charAt(i);
if(c>='A'&& c<='Z') {
dq.push(c);
}
else {
int cl = findlevel(c); //새로 온애
// int tl = findlevel(st.peek()); // 스택에 있던애
if(cl!=-1 ) {
if(c=='*'||c=='/') {
while(!st.isEmpty()&&(st.peek()=='*'||st.peek()=='/')) {
dq.push(st.pop());
}
}
else if(c=='+'||c=='-') {
while(!st.isEmpty()&&st.peek()!='(') {
dq.push(st.pop());
}
}
st.add(c);
}
else {
if(c=='(')st.add(c);
else if(c==')') {
while(!st.isEmpty() && st.peek()!='(')
{
dq.push(st.pop());
}
st.pop();
}
}
}
}
while(!st.isEmpty()) {
dq.push(st.pop());
}
StringBuilder sb = new StringBuilder();
while(!dq.isEmpty()){
sb.append(dq.pollLast());
}
System.out.println(sb);
}
}
<후위 표기식 구하는 법>
1. 문자일 경우에는 바로 답을 출력하는 배열에 담는다 (여기서는 deque)
2. * 또는 / 일 경우 스택이 아예 비거나 같은 우선순위 연산자가 나올때까지 stack을 pop해서 답에 추가를 한다.
3. + 또는 - 보다 우선순위가 작은 연산자는 없으므로 스택이 아예 비거나 '('가 없을 때까지 statck을 pop해서 답에 추가를 한다.
4. ')' 일경우 '(' 이 나올때까지 stack에서 pop해서 답에 추가를 한다.
'백준 > 스택' 카테고리의 다른 글
탑-2493번(java) (0) | 2021.08.05 |
---|---|
괄호제거-2800번(java) (0) | 2021.08.05 |
괄호 - Java (0) | 2021.03.23 |