카테고리 없음

[패캠 네카라쿠배 2기] 2차 테스트 - 6일차

닉네임이 멋이 중헌디 2021. 6. 21. 23:06

대표적인 데이터 구조4: 큐 (Queue)

운영체제 등에서 자주 사용

1. 큐 구조

  • 줄을 서는 행위와 유사
  • 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조
    • 음식점에서 가장 먼저 줄을 선 사람이 제일 먼저 음식점에 입장하는 것과 동일
    • FIFO(First-In, First-Out) 또는 LILO(Last-In, Last-Out) 방식으로 스택과 꺼내는 순서가 반대

* 출처: http://www.stoimen.com/blog/2012/06/05/computer-algorithms-stack-and-queue-data-structure/

엑셀로 이해해보기
// output을 할때는 가장 먼저 넣은것부터 빼게 된다 

2. 알아둘 용어

  • Enqueue: 큐에 데이터를 넣는 기능
  • Dequeue: 큐에서 데이터를 꺼내는 기능
  • Visualgo 사이트에서 시연해보며 이해하기 (enqueue/dequeue 만 클릭해보며
    enqueue는 tail에 추가, dequeue는 head에서 하나씩 삭제): https://visualgo.net/en/list


3. 파이썬 queue 라이브러리 활용해서 큐 자료 구조 사용하기

  • queue 라이브러리에는 다양한 큐 구조로 Queue(), LifoQueue(), PriorityQueue() 제공
  • 프로그램을 작성할 때 프로그램에 따라 적합한 자료 구조를 사용
    • Queue(): 가장 일반적인 큐 자료 구조
    • LifoQueue(): 나중에 입력된 데이터가 먼저 출력되는 구조 (스택 구조라고 보면 됨)
    • PriorityQueue(): 데이터마다 우선순위를 넣어서, 우선순위가 높은 순으로 데이터 출력

일반적인 큐 외에 다양한 정책이 적용된 큐들이 있음

3.1. Queue()로 큐 만들기 (가장 일반적인 큐, FIFO(First-In, First-Out))

In [8]:

 

import queue
data_queue = queue.Queue()

 

In [2]:

 

data_queue.put("funcoding")
data_queue.put(1)

 

In [3]:

 

 

 

data_queue.qsize()

Out[3]:

2

In [4]:

data_queue.get() // 먼저 넣은 funcoding부터 나온다

Out[4]:

'funcoding'

In [7]:

 

 

 

data_queue.qsize() // 다빼면 0이 된다 

Out[7]:

0

In [6]:

 

 

 

data_queue.get()

Out[6]:

1

3.2. LifoQueue()로 큐 만들기 (LIFO(Last-In, First-Out)) // 일반적이지 않은 변형된 큐
: 마지막에 넣은 것이 먼저 나오도록 

In [9]:

 

 

 

import queuedata_queue = queue.LifoQueue()

 

In [10]:

 

 

 

data_queue.put("funcoding")
data_queue.put(1)

 

In [11]:

 

data_queue.qsize()

Out[11]:

2

In [12]:

 

data_queue.get()

Out[12]:

1

3.3. PriorityQueue()로 큐 만들기

In [15]:

import queue
data_queue = queue.PriorityQueue() // 데이터를 넣을 때마다 우선순위 번호를 넣는다 (시간 순서가 아니라 데이터를 넣을 때 배정하는 우선 순위) 

 

In [16]:

data_queue.put((10, "korea")) //튜플을 만들어서 넣는데 첫 항목이 우선순위, 두번째가 데이터 
data_queue.put((5, 1))// 우선순위 5번, 실제 데이터는 1번
data_queue.put((15, "china"))//우선순위 15번 데이터는 china

//우선순위가 1부터: 숫자가 작을수록 우선

 

In [17]:

data_queue.qsize()

Out[17]:

3

In [18]:

data_queue.get()

Out[18]:

(5, 1)

In [19]:

 

data_queue.get()

Out[19]:

(10, 'korea')

참고: 어디에 큐가 많이 쓰일까?

  • 멀티 태스킹을 위한 프로세스 스케쥴링 방식을 구현하기 위해 많이 사용됨 (운영체제 참조)

큐의 경우에는 장단점 보다는 (특별히 언급되는 장단점이 없음), 큐의 활용 예로 프로세스 스케쥴링 방식을 함께 이해해두는 것이 좋음

4. 프로그래밍 연습

연습1: 리스트 변수로 큐를 다루는 enqueue, dequeue 기능 구현해보기

In [21]:

 

 

 

queue_list = list()def enqueue(data): queue_list.append(data) def dequeue(): data = queue_list[0] del queue_list[0] return data

 

In [22]:

 

 

 

for index in range(10): enqueue(index)

 

In [23]:

 

 

 

len(queue_list)

Out[23]:

10

In [26]:

 

 

dequeue()

Out[26]:

2

 

VisuAlgo - Linked List (Single, Doubly), Stack, Queue, Deque

VisuAlgo is free of charge for Computer Science community on earth. If you like VisuAlgo, the only payment that we ask of you is for you to tell the existence of VisuAlgo to other Computer Science students/instructors that you know =) via Facebook, Twitter

visualgo.net