Python 대기열: FIFO, LIFO 예
Python 대기줄?
큐는 데이터를 보관하는 컨테이너입니다. 먼저 입력된 데이터가 먼저 제거되므로 대기열을 FIFO(선입선출)라고도 합니다. 대기열에는 앞뒤로 두 개의 끝이 있습니다. 항목은 후면에서 입력되고 전면에서 제거됩니다.
어떻게 Python 대기열 작업?
대기열은 티켓 카운터에서 줄을 서서 기다리는 사람들의 줄, 먼저 서있는 사람이 먼저 티켓을 받고 다음 사람이 순서대로 진행되는 실제 사례와 쉽게 비교할 수 있습니다. 대기열 데이터 구조에도 동일한 논리가 적용됩니다.
다음은 대기열을 도식적으로 표현한 것입니다.
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 후방 항목이 대기열 내부에 삽입되는 지점을 나타냅니다. 이 예에서는 7이 해당 값입니다.
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 앞 대기열의 항목이 제거되는 지점을 나타냅니다. 그림에 표시된 대로 대기열에서 항목을 제거하면 얻게 되는 첫 번째 요소는 1입니다.
항목 1은 대기열에 가장 먼저 삽입된 항목이고, 항목을 제거하는 동안 가장 먼저 나오는 항목입니다. 따라서 대기열을 FIRST IN FIRST OUT(FIFO)이라고 합니다.
대기열에 있는 항목은 순서대로 제거되며 그 사이에는 제거할 수 없습니다. 대기열에서 항목 5를 무작위로 제거할 수는 없습니다. 그렇게 하려면 5 이전의 모든 항목을 제거해야 합니다. 대기열에 있는 항목은 삽입된 순서대로 제거됩니다.
대기열 유형 Python
대기열에는 주로 두 가지 유형이 있습니다. Python:
- 선입 선출 대기열: 이를 위해 먼저 나가는 요소가 가장 먼저 나옵니다. FIFO를 사용하려면 다음을 호출해야 합니다. 대기줄() 대기열 모듈의 클래스입니다.
- 후입선출 대기열: 여기에서는 마지막에 입력된 요소가 가장 먼저 나옵니다. LIFO를 사용하려면 다음을 호출해야 합니다. 리포큐() 대기열 모듈의 클래스입니다.
Python 대기열 설치
파이썬에서 큐를 사용하는 것은 매우 쉽습니다. 코드에서 대기열을 활용하기 위해 따라야 할 단계는 다음과 같습니다.
단계 1) 아래와 같이 대기열 모듈을 가져오기만 하면 됩니다.
import queue
이 모듈은 기본적으로 Python에서 사용할 수 있으며 대기열 작업을 시작하기 위해 추가 설치가 필요하지 않습니다. 대기열에는 FIFO(선입선출)와 LIFO(후입선출)의 두 가지 유형이 있습니다.
단계 2) FIFO 대기열을 사용하려면 아래와 같이 가져온 대기열 모듈을 사용하여 Queue 클래스를 호출하세요.
import queue q1 = queue.Queue()
단계 3) LIFO 대기열을 사용하려면 아래와 같이 LifoQueue() 클래스를 호출하십시오.
import queue q1 = queue.LifoQueue()
Queue 및 LifoQueue 클래스 내에서 사용 가능한 메서드
다음은 Queue와 LifoQueue 클래스 내부에서 사용 가능한 중요한 메서드입니다.
- 넣다(항목): 그러면 항목이 대기열에 추가됩니다.
- 얻다(): 그러면 대기열에서 항목이 반환됩니다.
- 비어 있는(): 대기열이 비어 있으면 true를 반환하고 항목이 있으면 false를 반환합니다.
- q크기(): 대기열의 크기를 반환합니다.
- 가득한(): 큐가 가득 찼으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
선입 선출 대기열의 예
선입선출의 경우, 먼저 들어간 요소가 가장 먼저 나옵니다.
대기열에 추가 및 항목 추가
대기열에 항목을 추가하는 예제를 살펴보겠습니다. 대기열 작업을 시작하려면 먼저 아래 예와 같이 모듈 대기열을 가져옵니다.
항목을 추가하려면 예제에 표시된 대로 put() 메소드를 사용할 수 있습니다.
import queue q1 = queue.Queue() q1.put(10) #this will additem 10 to the queue.
기본적으로 대기열의 크기는 무한하며 대기열에 항목을 원하는 만큼 추가할 수 있습니다. 대기열의 크기를 정의하려는 경우 다음과 같이 동일한 작업을 수행할 수 있습니다.
import queue q1 = queue.Queue(5) #The max size is 5. q1.put(1) q1.put(2) q1.put(3) q1.put(4) q1.put(5) print(q1.full()) # will return true.
출력:
True
이제 대기열의 크기는 5이고 5개 이상의 항목을 차지하지 않으며 q1.full() 메서드는 true를 반환합니다. 항목을 더 추가하면 더 이상 코드가 실행되지 않습니다.
대기열에서 항목 제거
대기열에서 항목을 제거하려면 get()이라는 메서드를 사용할 수 있습니다. 이 메서드는 호출 시 대기열의 항목을 허용합니다.
다음 예제는 대기열에서 항목을 제거하는 방법을 보여줍니다.
import queue q1 = queue.Queue() q1.put(10) item1 = q1.get() print('The item removed from the queue is ', item1)
출력:
The item removed from the queue is 10
후입선출 대기열 예
첫 번째 출력 대기열의 마지막 경우에는 마지막에 입력된 요소가 가장 먼저 나옵니다.
LIFO로 작업하려면, 즉 First Out 대기열의 마지막 대기열 모듈을 가져와서 LifoQueue() 메서드를 사용해야 합니다.
대기열에 추가 및 항목 추가
여기서는 LIFO 대기열에 항목을 추가하는 방법을 살펴보겠습니다.
import queue q1 = queue.LifoQueue() q1.put(10)
위의 예와 같이 LifoQueue에서 put() 메서드를 사용해야 합니다.
대기열에서 항목 제거
LIFOqueue에서 항목을 제거하려면 get() 메서드를 사용할 수 있습니다.
import queue q1 = queue.LifoQueue() q1.put(10) item1 = q1.get() print('The item removed from the LIFO queue is ', item1)
출력:
The item removed from the LIFO queue is 10
대기열에 1개 이상의 항목 추가
위의 예에서는 단일 항목을 추가하고 FIFO 및 LIFOqueue에 대한 항목을 제거하는 방법을 살펴보았습니다. 이제 두 개 이상의 항목을 추가하고 제거하는 방법을 살펴보겠습니다.
FIFOqueue에 추가 및 항목 추가
import queue q1 = queue.Queue() for i in range(20): q1.put(i) # this will additem from 0 to 20 to the queue
FIFOqueue에서 항목 제거
import queue q1 = queue.Queue() for i in range(20): q1.put(i) # this will additem from 0 to 20 to the queue while not q1.empty(): print("The value is ", q1.get()) # get() will remove the item from the queue.
출력:
The value is 0 The value is 1 The value is 2 The value is 3 The value is 4 The value is 5 The value is 6 The value is 7 The value is 8 The value is 9 The value is 10 The value is 11 The value is 12 The value is 13 The value is 14 The value is 15 The value is 16 The value is 17 The value is 18 The value is 19
LIFOqueue에 항목 추가 및 항목
import queue q1 = queue.LifoQueue() for i in range(20): q1.put(i) # this will additem from 0 to 20 to the queue
LIFOqueue에서 항목 제거
import queue q1 = queue.LifoQueue() for i in range(20): q1.put(i) # this will additem from 0 to 20 to the queue while not q1.empty(): print("The value is ", q1.get()) # get() will remove the item from the queue.
출력:
The value is 19 The value is 18 The value is 17 The value is 16 The value is 15 The value is 14 The value is 13 The value is 12 The value is 11 The value is 10 The value is 9 The value is 8 The value is 7 The value is 6 The value is 5 The value is 4 The value is 3 The value is 2 The value is 1 The value is 0
대기열 정렬
다음 예제는 큐 정렬을 보여줍니다. 정렬에 사용된 알고리즘은 버블 정렬입니다.
import queue q1 = queue.Queue() #Addingitems to the queue q1.put(11) q1.put(5) q1.put(4) q1.put(21) q1.put(3) q1.put(10) #using bubble sort on the queue n = q1.qsize() for i in range(n): x = q1.get() # the element is removed for j in range(n-1): y = q1.get() # the element is removed if x > y : q1.put(y) #the smaller one is put at the start of the queue else: q1.put(x) # the smaller one is put at the start of the queue x = y # the greater one is replaced with x and compared again with nextelement q1.put(x) while (q1.empty() == False): print(q1.queue[0], end = " ") q1.get()
출력:
3 4 5 10 11 21
Rev대기열 삭제 중
대기열을 되돌리려면 다른 대기열과 재귀를 사용할 수 있습니다.
다음 예에서는 대기열을 반대로 바꾸는 방법을 보여줍니다.
예:
import queue q1 = queue.Queue() q1.put(11) q1.put(5) q1.put(4) q1.put(21) q1.put(3) q1.put(10) def reverseQueue (q1src, q2dest) : buffer = q1src.get() if (q1src.empty() == False) : reverseQueue(q1src, q2dest) #using recursion q2dest.put(buffer) return q2dest q2dest = queue.Queue() qReversed = reverseQueue(q1,q2dest) while (qReversed.empty() == False): print(qReversed.queue[0], end = " ") qReversed.get()
출력:
10 3 21 4 5 11
요약
- 큐는 데이터를 보관하는 컨테이너입니다. 큐에는 FIFO와 LIFO의 두 가지 유형이 있습니다.
- FIFO(선입 선출 대기열)의 경우 먼저 나가는 요소가 가장 먼저 나옵니다.
- LIFO(Last In First Out Queue)의 경우 마지막에 입력된 요소가 가장 먼저 나옵니다.
- put(item) 메소드를 사용하여 대기열의 항목을 추가합니다.
- 항목을 제거하려면 get() 메소드를 사용합니다.