본문 바로가기

백준/스택

후위표기식 - 1918번(java)

728x90

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식

www.acmicpc.net

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