1918번: 후위 표기식
(2시간..)
후위 표기법의 장점?
중위 표기식 —> 후위 표기식으로 변환하기
중위표기식 → 후위 표기식으로 고치는 프로그램??
문제의 표기식은 "괄호" 가 들어간다.
A*(B+C) 의 경우
A*BC+
ABC+*
A+B*C-D/E
A+(BC)*-(DE)/
A+BC*-DE/
(ABC*)+-DE/
ABC*+-DE/
(ABC*+DE/)-
1. 우선순위
A. 최우선 순위 : 괄호
B. 두번 째 우선순위 : "*"나 "/"
2. 하나씩 피연산자를 산출한다.
50분이 걸려 "중위 표기식 → 후위표기식"으로 변환하는 IMAGE를 찾아보았다.
(((A/(B*C))+(D*E))-(A*C))
-----------
ABC
(((/(*
")"를 마주침
----
ABC*
(((/
")"를 마주침
----
ABC*/
((
----
ABC*/DE
((+(*
")"를 마주침
-----
ABC*/DE*
((+
")"를 마주침
----
ABC*/DE*+
(
----
ABC*/DE*+AC
(-(*
")"를 마주침
-----
ABC*/DE*+AC*
(-
")"를 마주침
ABC*/DE*+AC*-
예시2)
A*B*C*D 는 결과 AB*C*D*
package coding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static StringBuilder sb = new StringBuilder();
public static String input;
public static void Setting() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
}
public static void solve(){
// *,/는 1 , -,+는 0을 주어 , 이 정수값을 우선순위로 한다. 클 수록 우선순위가 높은 것.
Map<String,Integer> map = new HashMap<>();
map.put("*",1);
map.put("/",1);
map.put("+",0);
map.put("-",0);
Deque<String> stack = new LinkedList<>();
String pop ="";
String cur="";
int pr =0,curpr=0;
for(int i=0;i<input.length();i++){
cur = Character.toString(input.charAt(i));
// '(' 이면 무조건 stack에 넣는다.
if(cur.equals("("))stack.add(cur);
// ')' 이면 stack에 있는 모든 것을 꺼내 append한다. until '('이 나올 때 까지.
else if(cur.equals(")")){
while(stack.isEmpty()==false){
pop = stack.removeLast();
if(pop.equals("("))break;
sb.append(pop);
}
}
// 연산자이면 stack 에서 이 연산자보다 우선순위가 높은 애들을 모두 pop && append
else if(map.containsKey(cur)) {
curpr = map.get(cur);
while (stack.isEmpty()==false) {
pop = stack.peekLast();
if(pop.equals("(")) break;
pr = map.get(pop);
if(pr<curpr) break;
// 이 연산자보다 우선순위가 높은 연산자였다면
stack.removeLast();
sb.append(pop);
}
stack.add(cur);
}
// 알파벳은 무조건 append
else sb.append(cur);
}
// Stack에 남은 것을 append
while(stack.isEmpty()==false){
String rest = stack.removeLast();
if(rest.equals("(")) continue;
sb.append(rest);
}
}
public static void main(String[] args) throws IOException {
Setting();
solve();
System.out.println(sb.toString());
}
}