프로그래머스 자료구조 강의와 각종 인터넷 자료를 참고하여 재구성한 내용입니다.
Queue
-
컴퓨터의 기본적인 자료구조 중 하나
-
먼저 집어넣은 데이터가 먼저 나오는 FIFO(First In First Out) 구조
-
LIFO의 구조를 가지는 스택과 정반대
큐의 추상적 자료구조 구현
-
array를 이용하여 구현
- python list와 method 이용
-
linked list를 이용하여 구현
- 양방향 연결리스트 이용
큐의 동작
-
초기 상태: empty queue
-
데이터 원소 A를 큐에 추가
-
데이터 원소 B를 큐에 추가
-
데이터 원소 꺼내기
Q = Queue()
Q.enqueue(A)
Q.enqueue(B)
r1 = Q.dequeue()
r2 = Q.dequeue()
구현(1) - Array
class ArrayQueue:
def __init__(self):
self.data = []
def size(self):
return len(self.data)
def isEmpty(self):
return self.size == 0
def enqueue(self, item):
self.data.append(item)
def dequeue(self):
return self.data.pop(0)
def peek(self):
return self.data[0]
문제점
-
dequeue()의 경우 시간복잡도는 O(N)이다.
- enqueue는 리스트의 맨 끝에서만 일어나지만 dequeue는 두번째 원소~마지막 원소를 모두 한 칸씩 앞당겨야하기 때문이다.
구현(2) - Doubly Linked List
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class LinkedListQueue:
def __init__(self):
self.head = None
self.tail = None
def isEmpty(self):
if not self.head:
return True
return False
def enqueue(self, data):
if self.tail == None:
self.head = Node(data)
self.tail = self.head
else:
self.tail.next = Node(data)
self.tail.next.prev = self.tail
self.tail = self.tail.next
def dequeue(self):
if self.head == None:
return None
else:
temp = self.head.data
self.head = self.head.next
self.head.prev = None
return temp
def peek(self):
return self.head.data
def size(self):
temp = self.head
cnt = 0
while temp != None:
cnt += 1
temp = temp.next
return cnt
참조
-
프로그래머스 ‘어서와! 자료구조와 알고리즘은 처음이지?’
-
GeeksforGeeksPython Queue using Doubly Linked List
-
위키백과 큐(자료 구조)