PS/BOJ

[C++] 백준 1918번: 후위 표기식 - Stack

__PS 2023. 3. 13. 20:05
728x90

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

 

1918번: 후위 표기식

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

www.acmicpc.net

 

처음에는 상당히 애를 먹었던 문제

 

처음에 접근했던 방식은

(+) 연산자나 (-) 연산자는 (*) 연산자와 (/) 연산자보다 우선순위가 밀리기때문에 바로바로 출력하지 않고

뒤에 나오는 연산자를 기다리다가 출력을 하는 형식으로,

(*)연산자와 (/)연산자는 우선순위는 높지만 뒤에 또 (*)연산자나 (/)연산자가 나오게 된다면 연속적으로 이루어지기에

역시 저장을 한 후 출력을 하는 형식으로,

괄호가 포함되면 괄호가 나오기 전까지 어쩌구저쩌구..

 

상당히 복잡하게 생각했었는데,

가만 생각해보니 그냥 전부 저장을 한 후 괄호가 나오기 전까지 출력을 해주면 되는 문제였다..

단지 (+)연산자나 (-)연산자가 나왔을 때는 무지성 저장을,

(*)연산자와 (/)연산자가 나왔을 경우 저장된 기호가 (*)연산자와 (/)연산자가 나올 때까지 출력을 해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <stack>
using namespace std;
int main(){
    string s; cin >> s;
    stack<char>st;
    for(int i=0; i<s.length(); i++){
        if(s[i]>='A' && s[i]<='Z'cout << s[i];
        else if(s[i]=='(') st.push(s[i]);
        else if(s[i]==')'){
            while(!st.empty() && st.top()!='('){
                cout << st.top();
                st.pop();
            }
            if(!st.empty() && st.top()=='(') st.pop();
        }
        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]);
        }
    }
    while(!st.empty()){
        cout << st.top();
        st.pop();
    }
}
cs