콘텐츠로 이동

5.4   요약

1.   핵심 정리

  • 스택은 후입선출 원리를 따르는 자료 구조로, 배열이나 연결 리스트로 구현할 수 있다.
  • 시간 효율 측면에서 배열 기반 스택의 평균 효율은 더 높지만, 용량 확장이 발생하면 한 번의 삽입 연산의 시간 복잡도가 \(O(n)\)으로 나빠진다. 반면 연결 리스트 기반 스택은 더 안정적인 효율을 보인다.
  • 공간 효율 측면에서 배열 기반 스택은 어느 정도 공간을 낭비할 수 있다. 다만 연결 리스트의 노드 하나는 배열 원소보다 더 많은 메모리를 차지한다.
  • 큐는 선입선출 원리를 따르는 자료 구조로, 역시 배열이나 연결 리스트로 구현할 수 있다. 시간 및 공간 효율의 비교 결과는 앞의 스택과 비슷하다.
  • 덱은 자유도가 더 높은 큐로, 양 끝에서 원소를 추가하고 삭제할 수 있다.

2.   Q & A

Q: 브라우저의 앞으로 가기와 뒤로 가기는 이중 연결 리스트로 구현되는가?

브라우저의 앞으로 가기와 뒤로 가기는 본질적으로 ‘스택’을 보여 준다. 사용자가 새 페이지를 방문하면 맨 위에 추가되고, 뒤로 버튼을 누르면 그 페이지가 맨 위에서 꺼내진다. ‘덱’ 절에서 설명했듯 덱을 사용하면 일부 추가 연산을 편리하게 구현할 수 있다.

Q: 스택에서 노드를 꺼낸 뒤 그 노드의 메모리를 해제해야 하는가?

나중에 꺼낸 노드를 계속 사용해야 한다면 해제할 필요가 없다. 더 이상 사용하지 않는 경우, Java와 Python 같은 언어는 자동 가비지 컬렉션이 있으므로 직접 해제하지 않아도 된다. C와 C++에서는 직접 해제해야 한다.

Q: 덱은 두 스택을 이어 붙인 것처럼 보이는데, 어디에 쓰이는가?

덱은 스택과 큐를 합치거나 두 스택을 이어 붙인 것과 같다. 스택과 큐의 논리를 모두 지니므로 두 자료 구조의 모든 활용을 구현할 수 있고 더 유연하다.

Q: 실행 취소(undo)와 다시 실행(redo)은 구체적으로 어떻게 구현하는가?

스택 두 개를 사용한다. 스택 A는 실행 취소용, 스택 B는 다시 실행용이다.

  1. 사용자가 작업을 수행할 때마다 그 작업을 스택 A에 넣고 스택 B를 비운다.
  2. ‘실행 취소’를 수행하면 스택 A에서 가장 최근 작업을 꺼내 스택 B에 넣는다.
  3. ‘다시 실행’을 수행하면 스택 B에서 가장 최근 작업을 꺼내 스택 A에 넣는다.
댓글로 의견이나 질문, 제안을 남겨 주세요