Algorithm/BOJ

[백준] #1918 후위 표기식

jHoon0223 2021. 8. 22. 18:01

1918번: 후위 표기식 (acmicpc.net)

 

1918번: 후위 표기식

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

www.acmicpc.net

저번 학기 자료구조 수업때 배웠던 중위표기식 -> 후위표기식 변환 알고리즘을 복습할겸 다시 풀어보았다.

자료구조 수업때는 JAVA 환경에서 직접 stack 함수를 만들어 구현하였는데, 이번에는 C++환경에서 stack 라이브러리를 가져와 새로 구현하게 되었다.

오랜만에 구현하는 내용이라 그런지, stack에 담긴 연산자 우선순위를 고려하여 처리해주는 부분에서 조금 버벅거렸다.


  • 구현
#include <iostream>
#include <stack>

using namespace std;

int whoseFisrt(char c) {
    if (c == '*' || c == '/') return 2;
    if (c == '+' || c == '-') return 1;
    return 0;
}   //char를 인자로 받아 우선순위 return 해주는 함수

int main() {
    string s;
    cin >> s;
    //중위표기식 s 입력

    stack<char> stk;
    for (int i = 0; s[i]; i++) {
        if (s[i] >= 65 && s[i] <= 90) cout << s[i];
        //A~Z일 경우, 바로 출력
        else if (s[i] == '(') stk.push(s[i]);
        //'('일 경우, 스택에 push
        else if (s[i] == ')') {
            while(!stk.empty() && stk.top() != '(') {
                cout << stk.top();
                stk.pop();
            }   //스택의 top이 ')'이 아닐때 까지 pop하여 출력
            stk.pop();  //남아있는 '(' pop해서 제거
        }
        else {
            while (!stk.empty() && whoseFisrt(stk.top()) >= whoseFisrt(s[i])) {
                //스택의 top이 타겟으로 잡힌 string 인자보다 우선순위가 높거나 같을 경우,
                cout << stk.top();
                stk.pop();
            }   //스택의 top 원소 출력하고 pop
            stk.push(s[i]); //타겟으로 잡힌 string 인자를 다시 스택에 push
        }
    }
    while (!stk.empty()) {
        cout << stk.top();
        stk.pop();
    }   //string의 끝까지 돌았으면, 스택에 남아있는 인자들 모두 pop하여 출력 / 후위표기식 완성

    return 0;
}

따로 풀이를 쓰지않고 직접 주석을 모두 달아서 풀이를 작성했다.

 


728x90

'Algorithm > BOJ' 카테고리의 다른 글

[백준] #16953 A → B  (0) 2021.08.23
[백준] #12904 A와 B  (0) 2021.08.22
[백준] #17609 회문  (0) 2021.08.19
[백준] #1254 팰린드롬 만들기  (0) 2021.08.17
[백준] #4948 베르트랑 공준  (0) 2021.08.15