코딩 공부/백준

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

김 정 환 2021. 4. 20. 19:24
반응형

www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

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

www.acmicpc.net

 

 

 

알고리즘 종류

자료구조

스택

 

 

 

사고 과정

스택을 이용해서 풀 수 있습니다. 문제에서 제시된 예시를 손으로 풀어보면 나중에 나온 연산자가 알파벳 뒤에 먼저 붙는 것을 알 수 있습니다. 그리고 문자는 그대로 출력되는 것을 알 수 있습니다. 그래서 문자는 그대로 출력하고 연산자만 스택에 넣어서 해결하면 될 것 같습니다.

 

조건이 몇 가지 있습니다.

 

1. 괄호로 인해서 우선순위가 바뀔 수 있습니다. 그래서 괄호도 스택에 넣어줍니다.

 

2. + 또는 - 가 나오면 스택에서 '('를 제외하고 다 뽑습니다. 이들은 우선순위가 제일 낮기 때문입니다.

 

3. * 또는 / 가 나오면 스택에서 * 또는 / 일 때만 뽑습니다. 우선순위가 제일 높기 때문입니다. (문제에서 제시된 예시를 손으로 해보면 알 수 있습니다.)

 

4. )가 나오면 (를 만날 때까지 뽑습니다.

 

5. for문이 끝났다면, 스택에 남아있는 연산자들을 모두 뽑습니다.

 

 

 

구현(C++)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <stack>
#include <string>
 
using namespace std;
 
string str;
 
stack<char> s;
 
 
int main(void){
    
    cin >> str;
 
    for(int i=0; i<str.length(); i++){
        char c = str[i];
 
        if(c >= 'A' && c <= 'Z'cout << c;
        
        else if(c == '(') s.push(c);
        
        else if(c == ')'){
            while(s.top() != '('){
                cout << s.top();
                s.pop();
            }
            s.pop();
        }
        
        else if(c == '+' || c == '-'){
            while(!s.empty() && s.top() != '('){
                cout << s.top();
                s.pop();
            }
            s.push(c);
        }
        
        else if(c == '*' || c == '/'){
            while(!s.empty() && (s.top() == '*' || s.top() == '/')){
                cout << s.top();
                s.pop();
            }
            s.push(c);
        }
    }
    
    while(!s.empty()){
        cout << s.top();
        s.pop();
    }
}
cs

 

 

 

시행착오

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 7662 이중 우선순위 큐  (0) 2021.04.21
[백준][C++] 11000 강의실 배정  (0) 2021.04.21
[백준][C++] 9081 단어 맞추기  (0) 2021.04.20
[백준][C++] 18119 단어 암기  (0) 2021.04.20
[백준][C++] 1062 가르침  (0) 2021.04.19