BOJ 1918 후위 표기식
BOJ 1918 후위 표기식
문제
중위 표기식을 후위 표기식으로 바꾸기
복잡도 분석
- 시간복잡도 : O(n) - 스택 사용
- 공간복잡도 : O(n)
접근법
피연산자는 바로 출력하고
연산자의 경우 top에 있는 연산자가 현재 우선순위보다 높거나 같다면 pop
1
A+B-C
AB+C- 이렇게 나와야 하니까
괄호는 우선순위를 가장 낮게 설정해서 push한다. 다음 연산자들이 위에 쌓이도록…
그 다음 닫는 괄호를 만나면 여는 괄호를 만날때까지 스택의 모든 연산자를 pop 한다
풀이
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
53
54
55
56
57
58
59
60
61
#include <bits/stdc++.h>
using namespace std;
set<char> s = {'+','-','*','/'};
bool is_alpha(char x){
return ('A' <= x && x <='Z');
}
bool is_operator(char x){
if(s.find(x)==s.end()) return false;
return true;
}
int priority(char x){
if (x=='(') return 0;
if (x == '+' || x == '-') return 1;
if (x == '*' || x == '/') return 2;
return -1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
deque<char> q;
string inp; cin >> inp;
for(int i=0;i<size(inp);i++){
if (is_alpha(inp[i])){
cout << inp[i];
}
if (is_operator(inp[i])){
while (!q.empty() && priority(q.back()) >= priority(inp[i])){
cout << q.back();
q.pop_back();
}
q.push_back(inp[i]);
}
if (inp[i]=='('){
q.push_back('(');
}
if (inp[i]==')'){
while (q.back() != '('){
cout << q.back();
q.pop_back();
}
q.pop_back();
}
}
while(!q.empty()){
if (q.back()=='('){
q.pop_back();
}
else {
cout << q.back();
q.pop_back();
}
}
return 0;
}
연산자 우선순위 함수를 만드는걸 생각하기가 힘들었음. 예전에는 트리 순회 이용해서 풀었던걸로 기억함.
This post is licensed under CC BY 4.0 by the author.