[백준] 1918_후위 표기식 C++


스택 이용해보는 문제

정답제출코드


#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main()
{
    string s;
    cin >> s;

    stack<char> st;

    for (size_t i = 0; i < s.length(); ++i)
    {
        if (s[i] == '(')
            st.push(s[i]);
        
        else if (s[i] == '+' || s[i] == '-')
        {
            while (!st.empty() && st.top() != '(')
            {
                cout << st.top();
                st.pop();
            }
            st.push(s[i]);
        }
        else if (s[i] == '*' || s[i] == '/')
        {
            while (!st.empty() && st.top() != '(' && (st.top() == '*' || st.top() == '/'))
            {
                cout << st.top();
                st.pop();
            }
            st.push(s[i]);
        }
        else if (s[i] == ')')
        {
            while (!st.empty() && st.top() != '(')
            {
                cout << st.top();
                st.pop();
            }
            st.pop();
        }
        else if ('A' <= s[i] && s[i] <= 'Z')
            cout << s[i];
    }

    while (!st.empty())
    {
        cout << st.top();
        st.pop();
    }

    return 0;
}


스택을 이용해서 식을 출력해보는 문제였다.

하지만 곱하기와 나누기는 더하기와 빼기에 비해서 우선 순위가 높고,

괄호가 나왔을 때에도 우선 순위를 부여하는 데 어려움을 겪었다.

솔직히.. 도저히 우선순위를 부여할 방법이 떠오르지 않아서

참고링크를 참고해서 풀었다.

  • A~Z일 경우 바로 출력
  • 왼쪽 괄호라면 stack에 push
  • 연산자라면 우선순위 고려
stack top: + or -, 현재 연산자: * or /
stack에 현재 연산자 push

stack top: + or -, 현재 연산자: + or -
stack이 빌 때까지, 현재 연산자 우선순위와 같거나 낮을 동안 출력후 현재 연산자 push

stack top: or /, 현재 연산자: or /
stack이 빌 때까지, 현재 연산자 우선순위와 같거나 낮을 동안 출력후 현재 연산자 push

stack top: * or /, 현재 연산자: + or -
stack이 빌 때까지, 현재 연산자 우선순위와 같거나 낮을 동안 출력후 현재 연산자 push

이를 그대로 구현하면 위의 코드와 같아진다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2