c++ STL 로 스택을 구현하는 법은 크게 3가지다.
- array
- vector
- stack
나는 보통 vector를 사용해서 스택을 구현하곤 했는데 이번에 c++ STL을 공부하면서 STL에 stack이 따로 구현되어 있다는 걸 알게 되었다. 하지만 stack을 이용해서 알고리즘 푸는 경우를 한번도 본 적 없어서 왜 멀쩡한 stack을 만들어놓고 쓰질 않는지 그 이유가 궁금해졌다. 두 방법의 차이점은 뭐고 무엇을 사용하는게 좋을까? 구글링을 통해 내린 결론은 다음과 같다.
std::vector
장점
- std::vector 안에는 스택 동작에 필요한 모든 함수들이 구현되어 있다 (스택과 똑같이 이용할 수 있다.)
- std::stack과 시간 복잡도나 공간 복잡도에서 차이가 없다.
- 개별원소에 index로 접근 가능
std::stack
장점
스택을 사용했을 때의 장점에 대해서 나름 열심히 찾아봤다. 결론은 부터 말하면 스택을 사용하는 이유는 단 하나, 바로 가독성이다. 내가 만든 자료구조가 스택임을 명시하는 것은 코드 이해를 명확하게 한다. 사실 스택을 사용하는 것은 백터에 비해 단점이 많다.
단점
- 벡터와 달리 개별원소에 index로 접근 불가
- non-top elements에 접근할 수 없음 : 디버깅이 불가능
결론
std::stack의 경우, 인덱스로 접근할 수 없는거야 그렇다 쳐도 디버깅이 안되는 건 굉장히 치명적인 단점이다. 가독성과 디버깅 중 하나를 고르라면 당연히 디버깅이 아니겠는가? 결국 사람들이 잘 안쓰는데는 이유가 있는 것 같다.