BOJ 1918. 후위 표기식
1. 문제설명
- 
    중위 표기식이 주어졌을 때 후위 표기식으로 변경하라 
- 
    문제 분류 - Data Structure, Stack
 
2. 알고리즘 설계
- 문제를 보자마자 스택을 이용해야 된다는 생각이 들었다.
- 규칙을 조금 생각해보면, 문자는 그냥 출력하면 된다.
- 연산자 우선순위를 잘 고려해보자
    - 우선순위 : 괄호 -> 곱셈/나눗셈 -> 덧셈/뺄셈
- 괄호
        - 여는 괄호 : 스택에 그냥 넣는다.
- 닫는 괄호 : 스택의 top이 여는 괄호가 될 때까지 스택 원소를 꺼내 출력한다.
 
- 곱셈/나눗셈
        - 스택의 top이 곱셈 또는 나눗셈이 될 때까지 스택 원소를 꺼내 출력한다.
 
- 덧셈/뺄셈
        - 이 부분이 조금 헷갈릴 수 있겠다.
- 기본적으로 우선순위가 가장 뒤지만, 괄호 안에 있다면 우선 되어야 한다.
- 스택의 top이 여는 괄호가 될 때까지 스택 원소를 꺼내 출력한다.
 
 
- 이제 스택에 남은 걸 전부 출력해주면 된다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	string s;
	cin >> s;
	stack<char> st;
	for(char c : s) {
		if(c >= 'A' && c <= 'Z') cout << c;
		else {
			if(c == '(') st.push(c);
			else if(c == ')') {
				while(!st.empty() && st.top() != '(') {
					cout << st.top();
					st.pop();
				}
				st.pop();
			}
			else if(c == '*' || c == '/') {
				while(!st.empty() && (st.top() == '*' || st.top() == '/')) {
					cout << st.top();
					st.pop();
				}
				st.push(c);
			}
			else if(c == '+' || c == '-') {
				while(!st.empty() && st.top() != '(') {
					cout << st.top();
					st.pop();
				}
				st.push(c);
			}
		}
	}
	while(!st.empty()) {
		cout << st.top();
		st.pop();
	}
	return 0;
}