728x90
STL Stack을 이용하여 구현한다.
중위 표기를 후위 표기를 바꾸기 위해서 해야하는 행동
1. ( 은 스택에 넣는다.
2. )은 ( 가 나올 때까지 Stack을 비운다.
3. + - * / 는 Stack이 비어있는지 확인한다.
3-1 Stack이 비어있지 않는 경우 현재 연산자와 Stack top에 있는 연산자를 비교한다.
3-1-1 top 연산자가 우선 순위가 높은 경우 출력하고 다음 top도 3-1 행동을 반복한다.
4. 현재 연산자를 stack에 넣어준다.
#include <iostream>
#include <stack>
using namespace std;
int priority(char c) {
switch (c){
case '(': case ')': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
}
return -1;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
stack<char> st;
for(char c: s){
if( c >= 'A' && c <= 'Z' ) cout << c;
else if( c == '(' ) st.push(c);
else if( c == ')'){
while(!st.empty()){
char op = st.top();
st.pop();
if( op == '(' ) break;
else cout << op;
}
} else {
while(!st.empty()){
char op = st.top();
if( priority(c) <= priority(op)){
st.pop();
cout << op;
} else break;
}
st.push(c);
}
}
while(!st.empty()){
cout << st.top();
st.pop();
}
}
먼저 배열을 사용하여 구현하는 것이 훨씬 빠르다. 현 문제는 길이가 100이 넘지 않아서 배열사이즈을 100으로만 설정해줘도 크게 문제 없고 Vector로 구현하는 것보다 빠르다.
배열로 Stack을 구현해서 문제를 풀어도 되지만 귀찮으니까 STL Stack을 이용한다.
위 문제는 시간 0 ms가 걸리면서 끝난다.
하지만 위 코드상
while(!st.empty()){
char op = st.top();
if( priority(c) <= priority(op)){
st.pop();
cout << op;
} else break;
}
이런 부분에서 st.top() 함수를 자주 사용하여 비교하거나 출력할 때 사용했더니 시간 초과가 나서 이번 기회로 함수 호출을 자주하면 안되겠다는 생각을 하게 되었습니다.
반응형
'코딩 관련 > c++' 카테고리의 다른 글
백준 1966 프로그래머스 Level 2 프린터 큐 Java c++ (0) | 2020.04.24 |
---|---|
백준 수 정렬하기3 (0) | 2020.04.24 |
백준 2108번 통계학 (0) | 2020.04.24 |
백준 4949 균형잡힌 세상 (0) | 2020.04.23 |
백준 알고리즘 10817 세 수 중 두번째로 큰 수는? (0) | 2018.04.16 |