-
[ C++ ] 1918 - 후위표기식Algorithm/백준 2020. 7. 1. 16:48
풀이 과정
1. A-Z가 오면 ex에 담습니다.
2. A-Z가 아닌 연산자가 오면 stack에 쌓습니다.
3. ( 조건을 만족하는 동안 계속 ) stack의 맨 위 연산자가 새로 들어오는 연산자보다 가중치가 높거나 같으면 ex에 옮겨담습니다.
4. '(' 가중치에 상관 없이 무조건 stack에 쌓는다.
5. ')'를 만나면 '(' 위에 있는 모든 연산자를 ex에 옮긴다.
(A+B*C-D) → ABC*+D- 이 반례에서 문제가 생겨서 보니까 3번 과정의 조건을 만족하는 동안 계속 진행해줘야 해서 문제가 발생했다.
Code
#pragma warning(disable:C4996) #include <iostream> #include <stack> #include <vector> #include <string> using namespace std; char cmd[105]; char ex[105]; stack<char> st; bool compOper(char _top, char _new) { if ((_top == '+' || _top == '-') && (_new == '*' || _new == '/')) return false; return true; } int main() { ios_base::sync_with_stdio(false); cin >> cmd; int idx = 0; int eidx = 0; while (cmd[idx] != '\0') { if (cmd[idx] >= 'A' && cmd[idx] <= 'Z') { ex[eidx++] = cmd[idx]; } else { if (cmd[idx] == ')') { while (st.top() != '(') { ex[eidx++] = st.top(); st.pop(); } st.pop(); } else if (cmd[idx] == '('){ st.push(cmd[idx]); } else { while (!st.empty() && st.top() != '(' && compOper(st.top(), cmd[idx])) { ex[eidx++] = st.top(); st.pop(); } st.push(cmd[idx]); } } idx++; } while (!st.empty()) { ex[eidx++] = st.top(); st.pop(); } cout << ex; return 0; }
'Algorithm > 백준' 카테고리의 다른 글
[ C++ ] 2718 - 타일 채우기 (0) 2020.06.10 [ c++ ][ Python ] 퇴사 (0) 2020.04.30 [ Python ] 오르막수 (0) 2020.04.28