출처: https://3months.tistory.com/307 [Deep Play]

백준/Tree

[BOJ] 1918 후위표기식 C++

코딩하는 랄뚜기 2021. 8. 4. 12:57

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식

www.acmicpc.net

일반적인 계산식(중위 표기식)이 주어졌을 때, 이를 후위 표기식으로 바꾸는 문제이다. 괄호가 들어가서 예외 처리를 많이 해야 하는 문제이지만 다행히 사람들이 많은 반례를 구해놓아서 쉽게 구할 수 있었다.

후위->중위, 중위->후위로 변환할 때는 stack을 이용하면 된다. 또, 이 문제를 풀 때 개념은 계산순서의 우위를 이용해야 한다는 것이다.

1. * ,  / 이 올 경우 자신보다 계산순서가 낮은 ( , - , + 가 나올 때 까지 pop을 해준다.

2. - , +가 올 경우 자신보다 계산순서가 낮음 ( 가 나올 때 까지 pop을 해준다.

3. )가 올 경우 ( 가 나올 때 까지 pop을 해준다.

괄호의 계산 우선순위가 꼴찌라는 것이 핵심!(항상 괄호 안에 있는 식을 먼저 계산해야 하므로)

 

코드

#include <iostream>

#include <stack>

#include <string>

using namespace std;

stack<char> st;

string s;

int main(){

    cin>>s;

    for(int i=0;i<s.size();i++){

        if(('A'<=s[i]&&s[i]<='Z')||s[i]=='('){

            st.push(s[i]);

        }else if(s[i]=='*'||s[i]=='/'){

            while(!st.empty()){

                if(st.top()=='('||st.top()=='+'||st.top()=='-') break;

                cout<<st.top();

                st.pop();

            }

            st.push(s[i]);

        }else if(s[i]=='-'||s[i]=='+'){

            while(!st.empty()){

                if(st.top()=='(') break;

                cout<<st.top();

                st.pop();

            }

            st.push(s[i]);

        }else if(s[i]==')'){

            while(st.top()!='('){

                cout<<st.top();

                st.pop();

            }

            st.pop();

        }

    }

    while(!st.empty()){

        cout<<st.top();

        st.pop();

    }

    return 0;

}

 

'백준 > Tree' 카테고리의 다른 글

[BOJ] 19581 두 번째 트리의 지름 C++  (0) 2021.08.09
[BOJ] 1167 트리의 지름 C++  (0) 2021.08.09
[BOJ] 1655 가운데를 말해요 C++  (0) 2021.08.05
[BOJ] 1935 후위표기식2 C++  (0) 2021.08.04
[BOJ] 2263 트리의 순회 C++  (0) 2021.08.04