스택(Stack)과 큐(Queue)

 

좋습니다 👍
Stack(스택)과 Queue(큐)는 자료구조에서 매우 기초적이면서도 중요한 개념입니다.
제가 아래에서 개념 → 특징 → 동작 원리 → 예시 → 장단점 → 활용 사례 순서로 꼼꼼하게 설명드릴게요.


1. Stack (스택)

📌 개념

  • **"쌓아 올린 더미"**처럼 동작하는 자료구조.

  • LIFO (Last In, First Out) — 나중에 들어온 데이터가 먼저 나감.

  • 마치 접시를 쌓아 올리고, 맨 위의 접시부터 꺼내는 것과 같음.

📜 특징

  1. 한쪽 끝에서만 데이터의 삽입(Push)과 삭제(Pop)이 가능.

  2. 가장 마지막에 추가한 요소가 가장 먼저 제거됨.

  3. 중간 데이터 접근은 비효율적 (맨 위에서부터 하나씩 꺼내야 함).

⚙️ 동작

  • 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) — 먼저 들어온 데이터가 먼저 나감.

  • 은행 창구나 버스 정류장 줄 서기와 같음.

📜 특징

  1. **한쪽 끝(Rear)**에서 삽입, **반대쪽 끝(Front)**에서 삭제.

  2. 순서가 중요한 작업에 적합.

  3. 스택과 달리 중간 데이터 접근은 불가능.

⚙️ 동작

  • 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 과정이 눈에 쏙 들어옵니다.

댓글

이 블로그의 인기 게시물

자동차 바퀴를 매일 재발명할 거야? 재발명할거냐고 했지만 현실세계에서. 비유적으로 표현한 것이지.

돈벌고싶다, 돈벌자!!!

AI로 인해서 없어지는 일자리와 새로 생기는 일자리의 비율은 어떻게 될까