스택(Stack)과 큐(Queue)
좋습니다 👍
Stack(스택)과 Queue(큐)는 자료구조에서 매우 기초적이면서도 중요한 개념입니다.
제가 아래에서 개념 → 특징 → 동작 원리 → 예시 → 장단점 → 활용 사례 순서로 꼼꼼하게 설명드릴게요.
1. Stack (스택)
📌 개념
-
**"쌓아 올린 더미"**처럼 동작하는 자료구조.
-
LIFO (Last In, First Out) — 나중에 들어온 데이터가 먼저 나감.
-
마치 접시를 쌓아 올리고, 맨 위의 접시부터 꺼내는 것과 같음.
📜 특징
-
한쪽 끝에서만 데이터의 삽입(Push)과 삭제(Pop)이 가능.
-
가장 마지막에 추가한 요소가 가장 먼저 제거됨.
-
중간 데이터 접근은 비효율적 (맨 위에서부터 하나씩 꺼내야 함).
⚙️ 동작
-
Push : 데이터를 스택의 맨 위에 넣음.
-
Pop : 스택의 맨 위 데이터를 꺼냄.
-
Peek / Top : 맨 위의 데이터를 확인하되 제거하지 않음.
-
isEmpty : 스택이 비었는지 확인.
[Bottom] 1 → 2 → 3 → 4 [Top]
Push(5) → [Bottom] 1 → 2 → 3 → 4 → 5 [Top]
Pop() → 반환: 5, 남음: [Bottom] 1 → 2 → 3 → 4 [Top]
✅ 장점
-
구현이 간단하고 속도가 빠름 (O(1) 연산).
-
되돌리기(Undo), 뒤로 가기 기능 구현이 쉬움.
❌ 단점
-
중간 데이터 접근이 어려움.
-
고정 크기 스택은 공간 낭비 가능.
💡 활용 예시
-
함수 호출(콜 스택)
-
웹 브라우저 뒤로 가기
-
문서 작성 프로그램의 되돌리기(Undo)
-
깊이 우선 탐색(DFS)
2. Queue (큐)
📌 개념
-
**"줄 서기"**처럼 동작하는 자료구조.
-
FIFO (First In, First Out) — 먼저 들어온 데이터가 먼저 나감.
-
은행 창구나 버스 정류장 줄 서기와 같음.
📜 특징
-
**한쪽 끝(Rear)**에서 삽입, **반대쪽 끝(Front)**에서 삭제.
-
순서가 중요한 작업에 적합.
-
스택과 달리 중간 데이터 접근은 불가능.
⚙️ 동작
-
Enqueue : 데이터를 큐의 뒤쪽(Rear)에 추가.
-
Dequeue : 데이터를 큐의 앞쪽(Front)에서 꺼냄.
-
Peek / Front : 큐의 첫 번째 데이터를 확인하되 제거하지 않음.
-
isEmpty : 큐가 비었는지 확인.
Front [1, 2, 3, 4] Rear
Enqueue(5) → Front [1, 2, 3, 4, 5] Rear
Dequeue() → 반환: 1, 남음: Front [2, 3, 4, 5] Rear
✅ 장점
-
순차 처리에 적합.
-
공정한 데이터 처리 가능.
❌ 단점
-
삽입과 삭제가 반대 방향에서 일어나므로, 배열로 구현 시 메모리 이동이 발생할 수 있음.
💡 활용 예시
-
프린터 인쇄 대기열
-
운영체제의 프로세스 스케줄링
-
네트워크 패킷 전송 순서
-
너비 우선 탐색(BFS)
3. 스택과 큐 비교 표
| 구분 | Stack (스택) | Queue (큐) |
|---|---|---|
| 처리 순서 | LIFO | FIFO |
| 삽입 위치 | Top | Rear(뒤) |
| 삭제 위치 | Top | Front(앞) |
| 활용 예시 | 함수 호출, 뒤로 가기 | 인쇄 대기열, BFS |
| 접근성 | 맨 위만 접근 가능 | 맨 앞만 접근 가능 |
💬 비유
-
스택 : "책 더미" — 위에서만 넣고 빼는 구조.
-
큐 : "버스 줄" — 먼저 선 사람이 먼저 탑승.
원하시면 제가 스택과 큐의 Python 예제 코드도 만들어서, 실제 동작을 눈으로 확인할 수 있게 시뮬레이션 보여드릴 수 있습니다.
그렇게 하면 이해가 2배는 빨라집니다.
좋아요 👍
그럼 **스택(Stack)**과 **큐(Queue)**를 파이썬과 자바로 각각 간단하게 구현한 예제를 드리겠습니다.
두 언어 모두 직접 구현과 내장 자료구조 활용 두 가지 방식을 보여드릴게요.
🐍 1. 파이썬 예제
📌 스택 예제 (list 사용)
# 스택 구현
stack = []
# Push
stack.append(1)
stack.append(2)
stack.append(3)
print("스택 상태:", stack)
# Pop
print("Pop:", stack.pop())
print("Pop:", stack.pop())
print("스택 상태:", stack)
# Peek
if stack:
print("Top(맨 위):", stack[-1])
📌 큐 예제 (collections.deque 사용)
from collections import deque
# 큐 구현
queue = deque()
# Enqueue
queue.append(1)
queue.append(2)
queue.append(3)
print("큐 상태:", list(queue))
# Dequeue
print("Dequeue:", queue.popleft())
print("Dequeue:", queue.popleft())
print("큐 상태:", list(queue))
# Peek
if queue:
print("Front(맨 앞):", queue[0])
☕ 2. 자바 예제
📌 스택 예제 (java.util.Stack 사용)
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// Push
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("스택 상태: " + stack);
// Pop
System.out.println("Pop: " + stack.pop());
System.out.println("Pop: " + stack.pop());
System.out.println("스택 상태: " + stack);
// Peek
if (!stack.isEmpty()) {
System.out.println("Top(맨 위): " + stack.peek());
}
}
}
📌 큐 예제 (java.util.Queue 사용)
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
// Enqueue
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println("큐 상태: " + queue);
// Dequeue
System.out.println("Dequeue: " + queue.poll());
System.out.println("Dequeue: " + queue.poll());
System.out.println("큐 상태: " + queue);
// Peek
if (!queue.isEmpty()) {
System.out.println("Front(맨 앞): " + queue.peek());
}
}
}
💡 실행 결과 예시
(파이썬과 자바 모두 비슷한 흐름)
스택 상태: [1, 2, 3]
Pop: 3
Pop: 2
스택 상태: [1]
Top(맨 위): 1
큐 상태: [1, 2, 3]
Dequeue: 1
Dequeue: 2
큐 상태: [3]
Front(맨 앞): 3
원하시면 제가 스택과 큐의 동작을 시각적으로 애니메이션처럼 보여주는 콘솔 시뮬레이션 버전도 만들어 드릴 수 있습니다.
그렇게 하면 Push/Pop, Enqueue/Dequeue 과정이 눈에 쏙 들어옵니다.
댓글
댓글 쓰기