Algorithm/Problem Solve

[백준 1918번] 후위 표기식 (C++)

아네스 2021. 2. 11. 19:31
반응형

C++ 풀이

#include <bits/stdc++.h>

using namespace std;
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    string input;
    vector<char> result;
    vector<char> op;
    cin >> input;
    for(int i = 0; i<input.length(); i++)
    {
        if(input[i]>='A' && input[i] <='Z')
        {
        	//알파벳은 바로 출력할거고
            result.push_back(input[i]);
        }
        else{
        
            if(op.size() ==0) {
            	// 아무것도 없으면 그냥 넣으면 된다.
                op.push_back(input[i]);
            }else{
                if(input[i] == '(') op.push_back(input[i]);
                else if(input[i] ==')') {
                	// (를 만날때까지 pop하는 과정.
                    while(op.back() != '(')
                    {
                        result.push_back(op.back());
                        op.pop_back();
                    }
                    op.pop_back(); //pop '('
                }
                else if(input[i] == '+' || input[i] =='-')
                {
                	//+와 -는 (를 만날때까지 빼내거나, 혹은 빌때까지 빼낸다.
                    while(op.back() !='(' && !op.empty())
                    {
                        result.push_back(op.back());
                        op.pop_back();
                    }
                    //다 빼내면 자신을 넣는다.
                    op.push_back(input[i]);
                }
                else if(input[i]=='*' || input[i] == '/')
                {
                	//*,/는 자신과 동일한 우선순위를 가지는 *,/를 만날때까지 빼고
                    //비지는 않아야한다.
                    while(op.back() == '*' || op.back() == '/'&&!op.empty())
                    {
                        result.push_back(op.back());
                        op.pop_back();
                    }
                    //다 빼내면 자신을 넣는다.
                    op.push_back(input[i]);
                }
            }
        }
    }
    while(!op.empty()){
    	//for문이 끝났음에도 불구하고 남아있는 op를 처리해준다.
        result.push_back(op.back());
        op.pop_back();
    }
    //결과 출력
    for(int i = 0 ; i<result.size();i++)
    {
        cout << result[i];
    }

}
반응형