ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 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

    댓글

Designed by Tistory.