자료구조란 여러 데이터의 묶음을 저장하고, 사용하는 방법을 정의한 것이다.
대부분의 자료구조는 특정한 상황에 놓인 문제를 해결하는 데에 특화되어 있다. 따라서 많은 자료구조를 알아두면, 어떠한 상황이 닥쳤을 때 적합한 자료구조를 빠르고 정확하게 적용하여 문제를 해결할 수 있다.
Stack은 쌓다, 쌓이다, 포개지다 와 같은 뜻을 가지고 있다. 이 자료구조는 직역 그대로, 데이터(data)를 순서대로 쌓는 자료구조다.
원통을 자료구조 Stack, 구슬을 데이터(data)로 비유할 수 있다.
우리가 구슬을 차례대로 원통에 넣었을 때 가장 나중에 넣은 구슬이 원통의 가장 상단에 자리 잡고 있고, 그렇기 때문에 구슬을 빼는 경우에 가장 나중에 넣었던, 원통 상단에 위치한 구슬을 가장 먼저 뺄 수 있다.
1. LIFO(Last In First Out)
먼저 들어간 데이터는 제일 나중에 나오는 후입선출의 구조로 되어 있다.
예1) 1, 2, 3, 4를 스택에 차례대로 넣는다.
stack.push(데이터)
| 4 | <- top
| 3 |
| 2 |
| 1 |
들어간 순서대로, 1번이 제일 먼저 들어가고 4번이 마지막으로 들어가게 된다.
예2) 스택이 빌 때까지 데이터를 전부 빼낸다.
stack.pop()
| |
| |
| |
| |
4, 3, 2, 1
제일 마지막에 있는 데이터부터 차례대로 나오게 된다.
이러한 특성으로 인해 스택 구조 내에서 특정 데이터를 조회할 수 없으며, 스택의 최상단에서만 데이터를 저장하고 꺼낼 수 있는 특징이 있다.
2. 하나의 입출력 방향을 가지고 있습니다.
Stack 자료구조는 데이터를 넣고 뺄 수 있는 곳이 스택의 가장 최상단, 한 군데다. 즉 데이터를 넣을 때도 스택의 가장 최상단으로 넣고(입력) 뺄 때 또한 스택의 가장 최상단으로 데이터를 뺄 수(출력) 있다.
3. 데이터는 하나씩 넣고 뺄 수 있습니다.
앞서 말했듯, Stack 자료구조는 데이터를 넣고 뺄 수 있는 경로가 스택의 최상단, 한 군데이기 때문에 스택 내부에 데이터를 넣을 때도 하나씩 최상단을 통해 넣고 데이터를 뺄 때 또한 항상 스택 최상단에서 하나씩 데이터를 뺄 수 있다.
즉, 스택에 한 개씩 여러 번 데이터를 넣어 스택 내부에 데이터가 여러 개 쌓여 있다고 하더라도, 데이터를 뺄 때는 스택의 가장 최상단에서 한 번에 한 개의 데이터만을 뺄 수 있다.
큐(Queue)는 줄을 서서 기다리다, 대기행렬이라는 뜻을 가지고 있다.
자료구조 Queue는 Stack과 반대되는 개념으로, 먼저 들어간 데이터(data)가 먼저 나오는 FIFO(First In First Out) 혹은 LILO(Last In Last Out)을 특징으로 가지고 있다.이 자료구조는 입력의 방향과 출력의 방향이 각각 고정되어 있으며, 데이터를 입력할 시에는 큐의 끝에서(tail), 데이터를 출력할 때는 큐의 맨 앞에서(head) 진행된다.
Queue에 데이터를 넣는 것을 'enqueue', 데이터를 꺼내는 것을 'dequeue'라고 한다.
자료구조 Queue는 데이터(data)가 입력된 순서대로 처리할 때 주로 사용한다.
1. FIFO (First In First Out)
먼저 들어간 데이터가 제일 처음에 나오는 선입선출의 구조로 되어 있다.
예1) 1, 2, 3, 4를 큐에 차례대로 넣는다.
queue.enqueue(데이터)
출력 방향(head) <---------------------------< 입력 방향(tail)
1 <- 2 <- 3 <- 4
<---------------------------<
들어간 순서대로, 1번이 제일 먼저 들어가고 4번이 마지막으로 들어가게 된다.
예2) 큐가 빌 때까지 데이터를 전부 빼낸다.
queue.dequeue(데이터)
출력 방향(head) <---------------------------< 입력 방향(tail)
<---------------------------<
1, 2, 3, 4
제일 첫 번째 있는 데이터부터 차례대로 나오게 된다.
2. 두 개의 입출력 방향을 가지고 있다.
Queue 자료구조는 데이터의 입력, 출력 방향이 다르다.
데이터를 입력할 때는 큐의 맨 끝(tail)으로만 입력이 가능하며 데이터를 출력할 때는 큐의 맨 앞(head)으로만 출력이 가능하다.
즉, 큐는 데이터를 입력하는 곳과 출력하는 곳이 각각 정해져 있으며 이렇게 총 2개의 입출력 방향을 가지고 있다.
만약 입출력 방향이 같다면 Queue 자료구조라고 볼 수 없다.
3. 데이터는 하나씩 넣고 뺄 수 있다.
앞서 말했듯, Queue 자료구조는 데이터를 넣을 때는 큐의 맨 뒷부분에서 뺄 때는 큐의 맨 앞부분에서 처리를 진행한다. 각 처리 시마다 한 개의 데이터를 넣거나 뺄 수 있다.
즉, 큐에 한 개씩 여러 번 데이터를 넣어 큐 내부에 데이터가 여러 개 쌓여 있다고 하더라도, 데이터를 뺄 때는 큐의 맨 앞에서 한 번에 한 개의 데이터만을 뺄 수 있다.