스택(Stack)과 큐(Queue)는 컴퓨터 과학에서 중요한 개념으로, 각각의 자료구조는 데이터를 관리하고 처리하는 방식에 따라 차이점이 있습니다.
- 스택(Stack): 스택은 가장 나중에 들어온 요소가 가장 먼저 나가는, 즉 LIFO(Last In First Out,후입선출) 구조로 작동하는 자료구조입니다. 스택은 용량이 정해져 있으며, 스택이 가득 차면 더 이상 요소를 추가할 수 없습니다. 주요 연산에는 push(스택에 요소를 추가), pop(스택의 가장 위에 있는 요소를 제거하고 그 요소를 반환), peek(스택의 가장 위에 있는 요소를 확인하는데 이때 요소가 제거되지는 않음)가 있습니다. 스택은 함수 호출, 문법 체크, 후위 표기법 계산 등에 활용됩니다.
- 큐(Queue): 큐는 가장 먼저 들어온 요소가 가장 먼저 나가는, 즉 FIFO(First In First Out,선입선출) 구조로 작동하는 자료구조입니다. 주요 연산에는 enqueue(큐의 끝에 요소를 추가), dequeue(큐의 앞에서 요소를 제거하고 그 요소를 반환), peek/front(큐의 앞에 있는 요소를 확인하는데 이때 요소가 제거되지는 않음)가 있습니다. 큐는 운영 체제의 태스크 스케줄링, 너비 우선 탐색(Breadth First Search) 등에 활용됩니다.
즉 스택과 큐는 데이터를 추가하고 제거하는 순서에 따라 구분됩니다. 스택은 가장 나중에 추가된 데이터를 가장 먼저 처리하고, 큐는 가장 먼저 추가된 데이터를 가장 먼저 처리합니다.
**예시
- 스택(Stack): 스택은 책더미에 비유할 수 있습니다. 책을 쌓을 때는 위에서부터 쌓게 되고, 책을 꺼낼 때는 위에 있는 책부터 꺼내게 됩니다. 이처럼 가장 마지막에 들어온 것이 가장 먼저 나가는 구조를 스택이라고 합니다. 이것을 전문용어로는 LIFO(Last In First Out, 후입선출)라고 합니다.
- 큐(Queue): 큐는 사람들이 줄을 서서 기다리는 모습에 비유할 수 있습니다. 사람들이 줄을 서서 차례대로 기다리다가 차례가 되면 서비스를 받게 됩니다. 이처럼 가장 먼저 들어온 것이 가장 먼저 나가는 구조를 큐라고 합니다. 이것을 전문용어로는 FIFO(First In First Out, 선입선출)라고 합니다.
** 스택의 활용
- 함수 호출: 프로그램에서 함수를 호출할 때마다 시스템은 그 호출 정보(인자, 리턴 주소 등)를 스택에 저장합니다. 함수 호출이 끝나면 그 정보를 스택에서 빼내어(팝) 원래의 상태로 돌아갑니다. 이러한 방식으로 함수의 호출 순서와 실행 순서를 관리합니다.
- 문법 체크: 컴파일러는 괄호의 쌍이 올바른지 확인하기 위해 스택을 사용합니다. 여는 괄호가 나올 때마다 스택에 넣고(푸시), 닫는 괄호가 나올 때마다 스택에서 꺼내서(팝) 괄호의 쌍이 맞는지 확인합니다.
- 후위 표기법 계산: 후위 표기법(예: 2 3 +)은 스택을 이용해서 계산합니다. 숫자를 만나면 스택에 넣고, 연산자를 만나면 스택에서 숫자를 두 개 꺼내서 연산 후 결과를 다시 스택에 넣습니다. 이런 과정을 반복해 최종 결과를 얻습니다.
** 큐의 활용
- 운영 체제의 태스크 스케줄링: 컴퓨터에서 여러 프로그램이 동시에 실행될 때, 어떤 프로그램을 먼저 실행할지 결정하는 것이 태스크 스케줄링입니다. 이 때 큐를 사용해 먼저 요청된 작업부터 순서대로 처리합니다.
- 너비 우선 탐색(Breadth First Search): 그래프나 트리 같은 데이터 구조를 너비 우선으로 탐색할 때 큐를 사용합니다. 방문할 노드를 큐에 넣고, 방문할 때마다 큐에서 노드를 하나씩 꺼내서 이웃 노드를 다시 큐에 넣습니다. 이런 과정을 큐가 빌 때까지 반복해 모든 노드를 방문하게 됩니다.
너비 우선 탐색(Breadth First Search)는 이름에서 알 수 있듯이 "너비를 우선으로 탐색"하는 방법입니다. 예를 들어, 여러분이 많은 친구들과 함께 파티에 왔다고 생각해봅시다. 이 파티에서 당신이 알고 있는 사람은 당신 자신뿐입니다. 그러나 당신은 이 파티에 모든 사람을 만나고 싶습니다.
그래서, 당신은 자신이 알고 있는 사람(즉, 당신 자신)부터 시작해서, 그 사람의 친구들을 모두 만나게 됩니다. 그 다음에는 그 친구들의 친구들을 만나고, 그 다음에는 그 친구들의 친구들의 친구들을 만나는 식으로 진행됩니다. 이러한 방식으로 당신은 파티에 있는 모든 사람을 만나게 될 것입니다. 이것이 바로 너비 우선 탐색의 원리입니다.
이를 트리나 그래프의 관점에서 보면, '당신'은 시작점(루트 노드)이며, 당신의 친구들은 당신에게 직접 연결된 노드들이 됩니다. 그리고 그 친구들의 친구들은 다음 레벨의 노드들이 됩니다.
이러한 탐색 과정에서 큐(Queue)를 사용하는 이유는 무엇일까요? 그 이유는 당신이 만나야 할 사람들을 '기다리는 줄'에 넣어두려는 것입니다. 이 '기다리는 줄'이 바로 큐입니다. 큐는 먼저 들어온 사람이 먼저 나가는(FIFO: First In First Out) 특징을 가지고 있습니다. 이 특징 때문에, 당신은 당신이 만나야 할 사람들을 정확한 순서대로 만나게 됩니다.
즉, 너비 우선 탐색에서는 큐를 사용하여 '다음에 방문할 노드'들을 관리하게 됩니다. 이 방식을 통해 모든 노드를 방문하게 됩니다.
스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO 구조이며 정해진 방향으로만 데이터를 쌓을 수 있고 top을 통해서만 접근 가능합니다. 순차적으로 데이터를 추가하고 삭제하기 때문에 Arraylist 같은 배열기반의 컬렉션 클래스가 적합합니다. 웹 브라우저 방문기록, undo/redo 등이 있습니다. 웹 브라우저의 뒤로 가기 기능
큐는 가장 먼저 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO 구조입니다. 한 쪽에서는 삽입 작업이, 다른 쪽에서는 삭제 작업이 이루어집니다. 배열 기반 클래스를 사용하면 데이터를 꺼낼 때마다 빈 공간을 채우기 위해 데이터의 복사가 발생하므로 큐는 데이터의 추가와 삭제가 쉬운 링크드리스트로 구현하는 것이 더 적합합니다. 캐싱, 콜센터 대기시간, 최근 사용 문서가 있습니다. 프린터의 인쇄 대기열
'Mockterview' 카테고리의 다른 글
Call by reference (0) | 2023.05.18 |
---|---|
DI와 IoC, Bean pt.1 (0) | 2023.05.18 |
사용자 패스워드를 전송하고 보관하는 방법(일반적인 보안 방법) pt.1 (0) | 2023.05.18 |
시간복잡도와 공간복잡도 (1) | 2023.05.17 |
CORS(Cross-Origin Resource Sharing) (0) | 2023.05.17 |