본문 바로가기
Program/Language

[Python] FIFO Queue Python 예제

by 소중하루 2024. 11. 16.
반응형

FIFO Queue 예제 (First In, First Out Queue)

FIFO Queue 예제
FIFO Queue 예제

 

FIFO Queue는 데이터 구조 중 하나로, "먼저 들어온 데이터가 먼저 나간다"는 원칙을 따릅니다. 줄을 서는 것처럼, 큐의 앞부분에서 데이터를 제거하고, 새로운 데이터는 뒤에 추가됩니다.


특징

  1. 순서 유지:
    데이터가 추가된 순서대로 처리됩니다.
  2. 기본 연산:
    • Enqueue: 큐의 끝에 데이터를 추가합니다.
    • Dequeue: 큐의 앞에서 데이터를 제거하고 반환합니다.
  3. 접근 제한:
    큐의 중간에 있는 데이터는 직접 접근할 수 없으며, 오직 앞(front)과 뒤(rear)에서만 작업이 가능합니다.

구현 방식

FIFO Queue는 배열(Array), 링크드 리스트(Linked List), 또는 원형 큐(Circular Queue)로 구현할 수 있습니다.

1. 배열을 사용한 구현

  • 장점: 구현이 간단하고 이해하기 쉽습니다.
  • 단점: 고정된 크기의 배열에서는 크기 제한이 있어 효율성이 떨어질 수 있습니다.

Python 예제:

class FIFOQueue:
    def __init__(self):
        self.queue = []

    def enqueue(self, item):
        self.queue.append(item)  # 뒤에 추가

    def dequeue(self):
        if not self.is_empty():
            return self.queue.pop(0)  # 앞에서 제거
        else:
            raise IndexError("Queue is empty")

    def is_empty(self):
        return len(self.queue) == 0

    def peek(self):
        if not self.is_empty():
            return self.queue[0]  # 큐의 첫 번째 요소 반환
        else:
            raise IndexError("Queue is empty")

2. 링크드 리스트를 사용한 구현

  • 장점: 동적으로 크기를 조정할 수 있어 메모리 효율성이 높습니다.
  • 단점: 구현이 다소 복잡합니다.

Python 예제:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class FIFOQueue:
    def __init__(self):
        self.front = None  # 큐의 첫 번째 노드
        self.rear = None   # 큐의 마지막 노드

    def enqueue(self, item):
        new_node = Node(item)
        if self.rear is None:  # 큐가 비어있을 때
            self.front = self.rear = new_node
        else:
            self.rear.next = new_node
            self.rear = new_node

    def dequeue(self):
        if self.front is None:
            raise IndexError("Queue is empty")
        removed_data = self.front.data
        self.front = self.front.next
        if self.front is None:  # 큐가 비어 있다면 rear도 None으로 설정
            self.rear = None
        return removed_data

    def is_empty(self):
        return self.front is None

    def peek(self):
        if self.front is None:
            raise IndexError("Queue is empty")
        return self.front.data

FIFO Queue의 활용 사례

  1. 운영체제:
    • 작업 스케줄링(예: 프린터 작업 큐)에서 사용됩니다.
  2. 네트워크:
    • 데이터 패킷 전송 순서를 유지하기 위한 버퍼링.
  3. 웹 서버:
    • 요청 처리 대기열.
  4. 게임 개발:
    • 이벤트 큐를 관리.

장점과 단점

장점 단점
데이터 처리 순서를 명확히 유지 중간 데이터에 직접 접근 불가
구현이 단순하고 직관적 배열 기반 큐는 크기 제한으로 비효율적일 수 있음 (재배열이 필요)
메모리를 효율적으로 사용할 수 있음 (링크드 리스트 사용 시) 큐의 크기가 커지면 시간 및 메모리 오버헤드 증가 가능

FIFO Queue는 간단하면서도 강력한 데이터 구조로, 다양한 상황에서 데이터를 순차적으로 처리해야 할 때 유용합니다. 필요에 따라 구현 방식을 선택하여 활용하면 됩니다.

반응형

댓글