[CS/자료구조] 스택(Stack), 큐(Queue), 덱(Deque)

cs자료구조
avatar
2025.03.20
·
6 min read

스택 Stack

4177
  • LIFO (Last In First Out) 구조

    • 한 쪽에서만 데이터의 삽입 및 삭제가 가능한 자료구조

    • 나중에 삽입된 데이터가 먼저 나오게 되는 구조

  • 특징

    • top : 가장 마지막에 들어온 데이터

    • push : top 위에 데이터 삽입

    • pop : 가장 위에 있는 데이터 삭제

  • 활용

    • 재귀 알고리즘

    • DFS

    • 웹 브라우저 뒤로 가기, 실행 취소

    • 괄호 검사, 후위 연산법, 문자열 역순 출력 등

  • 파이썬은 리스트를 활용하면 된다.

1⃣ 데이터 추가 : append()

stack = []
stack.append(1) # [1]
stack.append(2) # [1, 2]
stack.append(3) # [1, 2, 3]

2⃣ 데이터 삭제 : pop()

stack.pop() # [1, 2]
stack.pop() # [1]

3⃣ 데이터 유무 확인 : isEmpty()

stack.isEmpty()

큐 Queue

4179
  • FIFO (First In First Out) 구조

    • 한 쪽으로 데이터를 삽입하고, 다른 쪽으로 데이터를 삭제할 수 있는 자료구조

    • 먼저 삽입된 데이터가 먼저 나오게 되는 구조

  • 특징

    • enqueue() : 큐의 한 쪽 끝에 데이터를 삽입하는 연산

      • 새로운 큐의 뒤(rear)로 넣음

    • dequeue() : 다른 한 쪽 끝으로 데이터를 삭제하는 연산

      • 기존 데이터를 큐의 앞(front)에서 빼냄

  • 파이썬은 collections 모듈에서 deque 클래스를 활용한다.

  • 활용

    • BFS(Breadth-First Search)

    • 작업 스케줄링

    • 대기열 관리

    • 웹 서버 요청 처리

1⃣ 큐 생성 : deque()

from collections import deque

queue = deque() # 빈 큐 생성

2⃣ 데이터 추가 : append()

queue.append(3) # [3]
queue.append(5) # [3, 5]
queue.append(7) # [3, 5, 7]

3⃣ 데이터 삭제 : popleft()

queue.popleft() # [5, 7], 가장 앞에 있는 데이터 3 제거

3⃣ 프론트 및 후방 연산

# 프론트(Front)
front = queue[0] # 5

# 후방 (Rear)
rear = queue[-1] # 7

원형 큐 (Circular Queue)

4180
  • 일반적인 FIFO 큐의 문제인 공간 낭비를 해결하기 위해 고안된 자료구조

  • 큐의 마지막 위치에 도달하면 다시 처음 위치로 돌아가 데이터를 저장

  • 배열을 원형으로 사용하여 데이터를 순환하면서 저장하는 방식

  • 특징

    • 배열 인덱 스 처리

    • 공간 활용

    • 포인터 사용

class CircularQueue:
    def __init__(self, size):
        self.size = size  # 큐 크기 설정
        self.queue = [None] * size  # 크기만큼의 리스트를 생성하여 큐를 초기화합니다.
        self.front = self.rear = -1  # front와 rear를 초기화합니다.

    def is_full(self):
        # rear 다음 위치가 front인 경우 큐가 가득 찬 상태입니다.
        return (self.rear + 1) % self.size == self.front

    def is_empty(self):
        # front와 rear가 동일한 경우 큐가 비어 있는 상태입니다.
        return self.front == -1

    def enqueue(self, data):
        if self.is_full():
            print("Queue is full")
        elif self.is_empty():
            self.front = self.rear = 0  # 큐가 비어 있는 경우 front와 rear를 0으로 설정합니다.
            self.queue[self.rear] = data
        else:
            self.rear = (self.rear + 1) % self.size  # rear를 다음 위치로 이동합니다.
            self.queue[self.rear] = data

    def dequeue(self):
        if self.is_empty():
            print("Queue is empty")
            return None
        elif self.front == self.rear:
            temp = self.queue[self.front]
            self.front = self.rear = -1  # 큐에 하나의 요소만 남아 있는 경우 front와 rear를 초기화합니다.
            return temp
        else:
            temp = self.queue[self.front]
            self.front = (self.front + 1) % self.size  # front를 다음 위치로 이동합니다.
            return temp

    def front(self):
        if self.is_empty():
            print("Queue is empty")
            return None
        return self.queue[self.front]

    def rear(self):
        if self.is_empty():
            print("Queue is empty")
            return None
        return self.queue[self.rear]

# 사용 예제
cq = CircularQueue(3)  # 크기가 3인 환형 큐를 생성합니다.

# 큐에 데이터 삽입
cq.enqueue(1)
cq.enqueue(2)
cq.enqueue(3)

# 큐가 가득 찬 상태 확인
print(cq.is_full())  # 출력: True

# 큐에서 데이터 삭제
print(cq.dequeue())  # 출력: 1

# 큐에 데이터 삽입
cq.enqueue(4)

# 큐의 현재 상태 출력
print(cq.queue)  # 출력: [4, 2, 3]

# 큐의 front와 rear 요소 확인
print("Front element:", cq.queue[cq.front])  # 출력: Front element: 2
print("Rear element:", cq.queue[cq.rear])  # 출력: Rear element: 4

덱 Deque

4181
  • 양방향 큐 (Double-ended queue)

    • 양쪽 (front, rear)에서 삽입과 삭제가 모두 가능한 큐

  • 파이썬에서는 collections 모듈의 deque 클래스를 활용한다.

1⃣ 데이터 추가 : append(), appendleft()

  • append() : Deque의 뒤쪽에 데이터 추가

  • appendleft() : Deque의 앞쪽에 데이터 추가

from collections import deque

d = deque()

d.append(1) # [1]
d.append(2) # [1, 2]
d.appendleft(3) # [3, 1, 2]

2⃣ 데이터 삭제 : pop(), popleft()

  • pop() : Deque의 뒤쪽에서 요소 제거 및 반환

  • popleft() : Deque의 앞쪽에서 요소 제거 및 반환

d.pop() # [3, 1]
d.popleft() # [1]






- 컬렉션 아티클