Python Hàng đợi: FIFO, LIFO Ví dụ

Là gì Python Xếp hàng?

Hàng đợi là nơi chứa dữ liệu. Dữ liệu được nhập trước sẽ bị xóa trước và do đó hàng đợi còn được gọi là “First in First Out” (FIFO). Hàng đợi có hai đầu phía trước và phía sau. Các mục được nhập từ phía sau và loại bỏ từ phía trước.

Làm thế nào để Python Công việc xếp hàng?

Có thể dễ dàng so sánh hàng đợi với ví dụ thực tế về dòng người xếp hàng chờ ở quầy bán vé, người đứng trước sẽ nhận được vé trước, tiếp theo là người tiếp theo, v.v. Logic tương tự cũng áp dụng cho cấu trúc dữ liệu hàng đợi.

Dưới đây là sơ đồ biểu diễn hàng đợi:

Python xếp hàng làm việc

Đuôi đại diện cho điểm mà các mục được chèn vào trong hàng đợi. Trong ví dụ này, 7 là giá trị cho điều đó.

Mặt trận đại diện cho điểm mà các mục trong hàng đợi sẽ bị xóa. Nếu bạn xóa một mục khỏi hàng đợi, phần tử đầu tiên bạn sẽ nhận được là 1, như trong hình.

Mục 1 là mục đầu tiên được chèn vào hàng đợi và khi xóa nó là mục đầu tiên xuất hiện. Do đó hàng đợi được gọi là FIRST IN FIRST OUT (FIFO)

Python xếp hàng làm việc

Trong hàng đợi, các mục được xóa theo thứ tự và không thể xóa ở giữa. Bạn không thể xóa ngẫu nhiên mục 5 khỏi hàng đợi, để làm được điều đó, bạn sẽ phải xóa tất cả các mục trước mục 5. Các mục trong hàng đợi sẽ bị xóa theo thứ tự chúng được chèn vào.

Các loại hàng đợi trong Python

Chủ yếu có hai loại hàng đợi trong Python:

  • Hàng đợi vào trước ra trước: Đối với điều này, phần tử đến trước sẽ là phần tử xuất hiện đầu tiên. Để làm việc với FIFO, bạn phải gọi Xếp hàng() lớp từ mô-đun hàng đợi.
  • Hàng đợi cuối cùng ra trước: Ở đây, phần tử được nhập cuối cùng sẽ là phần tử xuất hiện đầu tiên. Để làm việc với LIFO, bạn phải gọi LifoQueue() lớp từ mô-đun hàng đợi.

Python cài đặt hàng đợi

Rất dễ dàng để làm việc với hàng đợi trong python. Dưới đây là các bước cần làm theo để sử dụng hàng đợi trong mã của bạn.

Bước 1) Bạn chỉ cần nhập mô-đun hàng đợi, như hiển thị bên dưới:

import queue

Theo mặc định, mô-đun này có sẵn với python và bạn không cần bất kỳ cài đặt bổ sung nào để bắt đầu làm việc với hàng đợi. Có 2 loại hàng đợi FIFO (vào trước ra trước) và LIFO (vào sau ra trước).

Bước 2) Để làm việc với hàng đợi FIFO, hãy gọi lớp Hàng đợi bằng cách sử dụng mô-đun hàng đợi được nhập như dưới đây:

import queue
q1 = queue.Queue()

Bước 3) Để làm việc với hàng đợi LIFO, hãy gọi lớp LifoQueue() như dưới đây:

import queue
q1 = queue.LifoQueue()

Các phương thức có sẵn bên trong lớp Queue và LifoQueue

Sau đây là các phương thức quan trọng có sẵn trong lớp Queue và LifoQueue:

  • đặt (mục): Điều này sẽ đưa mục vào hàng đợi.
  • lấy(): Điều này sẽ trả lại cho bạn một mục từ hàng đợi.
  • trống(): Nó sẽ trả về true nếu hàng đợi trống và trả về false nếu có các mục.
  • qsize(): trả về kích thước của hàng đợi.
  • đầy(): trả về true nếu hàng đợi đã đầy, nếu không trả về false.

Ví dụ về hàng đợi vào trước ra trước

Trong trường hợp nhập trước xuất trước, phần tử nào đi trước sẽ là phần tử ra trước.

Thêm và mục trong hàng đợi

Chúng ta hãy làm một ví dụ để thêm một mục vào hàng đợi. Để bắt đầu làm việc với hàng đợi, trước tiên hãy nhập hàng đợi mô-đun, như trong ví dụ bên dưới.

Để thêm một mục, bạn có thể sử dụng phương thức put() như trong ví dụ:

import queue
q1 = queue.Queue()
q1.put(10) #this will additem 10 to the queue.

Theo mặc định, kích thước của hàng đợi là vô hạn và bạn có thể thêm bất kỳ số lượng mục nào vào đó. Trong trường hợp bạn muốn xác định kích thước của hàng đợi, bạn có thể thực hiện tương tự như sau

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.

Đầu ra:

True

Bây giờ kích thước của hàng đợi là 5 và sẽ không mất quá 5 mục và phương thức q1.full() sẽ trả về true. Việc thêm bất kỳ mục nào nữa sẽ không thực thi mã nữa.

Xóa một mục khỏi hàng đợi

Để xóa một mục khỏi hàng đợi, bạn có thể sử dụng phương thức get(). Phương pháp này cho phép các mục từ hàng đợi khi được gọi.

Ví dụ sau đây cho thấy cách xóa một mục khỏi hàng đợi.

import queue
q1 = queue.Queue()
q1.put(10)

item1 = q1.get()

print('The item removed from the queue is ', item1)

Đầu ra:

The item removed from the queue is  10

Ví dụ về hàng đợi vào trước ra trước

Trong trường hợp cuối cùng trong hàng đợi ra đầu tiên, phần tử được nhập cuối cùng sẽ xuất hiện đầu tiên.

Để làm việc với LIFO, tức là cuối cùng trong hàng đợi ra đầu tiên, chúng ta cần nhập mô-đun hàng đợi và sử dụng phương thức LifoQueue().

Thêm và mục trong hàng đợi

Ở đây chúng ta sẽ hiểu cách thêm một mục vào hàng đợi LIFO.

import queue
q1 = queue.LifoQueue()
q1.put(10)

Bạn phải sử dụng phương thức put() trên LifoQueue, như trong ví dụ trên.

Xóa một mục khỏi hàng đợi

Để xóa một mục khỏi hàng đợi LIFO, bạn có thể sử dụng phương thức get().

import queue
q1 = queue.LifoQueue()
q1.put(10)

item1 = q1.get()

print('The item removed from the LIFO queue is ', item1)

Đầu ra:

The item removed from the LIFO queue is  10

Thêm nhiều hơn 1 mục vào Hàng đợi

Trong các ví dụ trên, chúng ta đã thấy cách thêm một mục và xóa mục đó cho hàng đợi FIFO và LIFO. Bây giờ chúng ta sẽ xem cách thêm nhiều mục và xóa mục đó.

Thêm và ghi vào hàng FIFO

import queue
q1 = queue.Queue()

for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Xóa một mục khỏi hàng đợi FIFO

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.

Đầu ra:

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

Thêm và ghi vào hàng LIFO

import queue
q1 = queue.LifoQueue()
for i in range(20):
    q1.put(i) # this will additem from 0 to 20 to the queue

Xóa một mục khỏi hàng đợi LIFO

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.

Đầu ra:

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 

Sắp xếp hàng đợi

Ví dụ sau đây cho thấy cách sắp xếp hàng đợi. Thuật toán được sử dụng để sắp xếp là sắp xếp nổi bọt.

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()

Đầu ra:

3 4 5 10 11 21

Revxóa hàng đợi

Để đảo ngược hàng đợi, bạn có thể sử dụng hàng đợi khác và đệ quy.

Ví dụ sau đây cho thấy cách đảo ngược hàng đợi.

Ví dụ:

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()

Đầu ra:

10 3 21 4 5 11

Tổng kết

  • Hàng đợi là nơi chứa dữ liệu. Có hai loại hàng đợi là FIFO và LIFO.
  • Đối với FIFO (Hàng đợi vào trước ra trước), phần tử nào đến trước sẽ là phần tử xuất hiện đầu tiên.
  • Đối với LIFO (Hàng đợi vào trước ra trước), phần tử được nhập sau cùng sẽ là phần tử xuất hiện đầu tiên.
  • Một mục trong hàng đợi được thêm bằng phương thức put(item).
  • Để xóa một mục, phương thức get() được sử dụng.

Bản tin Guru99 hàng ngày

Bắt đầu ngày mới của bạn với những tin tức AI mới nhất và quan trọng nhất hiện nay.