Python คิว: FIFO, LIFO ตัวอย่าง
ความหมายของ Python คิว?
คิวคือคอนเทนเนอร์ที่เก็บข้อมูล ข้อมูลที่ป้อนก่อนจะถูกลบออกก่อน และคิวจึงเรียกอีกอย่างว่า "เข้าก่อนออกก่อน" (FIFO) คิวมีสองปลายทั้งหน้าและหลัง รายการจะถูกป้อนจากด้านหลังและนำออกจากด้านหน้า
อย่างไร Python งานเข้าคิว?
สามารถเปรียบเทียบคิวกับตัวอย่างในชีวิตจริงได้อย่างง่ายดาย เช่น การต่อคิวที่เคาน์เตอร์จำหน่ายตั๋ว คนที่ยืนก่อนจะได้ตั๋วก่อน ตามด้วยคนถัดไป เป็นต้น ตรรกะเดียวกันนี้ใช้กับโครงสร้างข้อมูลคิวด้วย
นี่คือการแสดงคิวแบบไดอะแกรม:
การขอ ด้านหลัง แสดงถึงจุดที่รายการถูกแทรกเข้าไปในคิว ในตัวอย่างนี้ 7 คือค่าของค่านั้น
การขอ ด้านหน้า แสดงถึงจุดที่รายการออกจากคิวจะถูกลบออก หากคุณลบไอเท็มออกจากคิว องค์ประกอบแรกที่คุณจะได้รับคือ 1 ดังแสดงในรูป
รายการที่ 1 เป็นรายการแรกที่จะถูกแทรกลงในคิว และในขณะที่นำออกจะเป็นรายการแรกที่ออกมา ดังนั้นคิวจึงถูกเรียกว่า FIRST IN FIRST OUT (FIFO)
ในคิว รายการต่างๆ จะถูกลบออกตามลำดับ และไม่สามารถลบออกจากระหว่างนั้นได้ คุณไม่สามารถลบรายการที่ 5 แบบสุ่มออกจากคิวได้ โดยคุณจะต้องลบรายการทั้งหมดก่อนรายการที่ 5 รายการในคิวจะถูกลบออกตามลำดับที่แทรกไว้
ประเภทของคิวเข้า Python
ส่วนใหญ่จะมีคิวอยู่สองประเภท Python:
- เข้าก่อนออกก่อน: สำหรับสิ่งนี้ องค์ประกอบที่ไปก่อนจะเป็นคนแรกที่ออกมา หากต้องการทำงานกับ FIFO คุณต้องโทร คิว() คลาสจากโมดูลคิว
- เข้าคิวออกก่อน: ตรงนี้ องค์ประกอบที่ป้อนสุดท้ายจะเป็นคนแรกที่ออกมา หากต้องการทำงานกับ LIFO คุณต้องโทร LifoQueue() คลาสจากโมดูลคิว
Python การติดตั้งคิว
มันง่ายมากที่จะทำงานกับคิวในหลาม ต่อไปนี้เป็นขั้นตอนที่ต้องปฏิบัติตามเพื่อใช้คิวในโค้ดของคุณ
ขั้นตอน 1) คุณเพียงแค่ต้องนำเข้าโมดูลคิว ดังที่แสดงด้านล่าง:
import queue
โมดูลนี้ใช้งานได้ตามค่าเริ่มต้นกับ python และคุณไม่จำเป็นต้องติดตั้งเพิ่มเติมเพื่อเริ่มทำงานกับคิว คิว FIFO มี 2 ประเภท (เข้าก่อนออกก่อน) และ LIFO (เข้าก่อนออกก่อน)
ขั้นตอน 2) หากต้องการทำงานกับคิว FIFO ให้เรียกคลาส Queue โดยใช้โมดูลคิวที่นำเข้าตามที่แสดงด้านล่าง:
import queue q1 = queue.Queue()
ขั้นตอน 3) หากต้องการทำงานกับคิว LIFO ให้เรียกคลาส LifoQueue() ดังที่แสดงด้านล่าง:
import queue q1 = queue.LifoQueue()
วิธีการที่มีอยู่ในคลาส Queue และ LifoQueue
ต่อไปนี้เป็นวิธีการสำคัญที่มีอยู่ในคลาส Queue และ LifoQueue:
- ใส่(รายการ): นี่จะทำให้รายการอยู่ในคิว
- รับ(): นี่จะส่งคืนรายการให้คุณจากคิว
- ว่างเปล่า(): มันจะคืนค่าเป็นจริงหากคิวว่างเปล่าและเป็นเท็จหากมีรายการอยู่
- ขนาดไซส์(): ส่งกลับขนาดของคิว
- เต็ม(): คืนค่าเป็นจริงถ้าคิวเต็ม ไม่เช่นนั้นคืนค่าเท็จ
ตัวอย่างคิวเข้าก่อนออกก่อน
ในกรณีที่เข้าก่อนออกก่อน องค์ประกอบที่ไปก่อนจะเป็นคนแรกที่ออกมา
เพิ่มและรายการในคิว
ให้เราทำงานกับตัวอย่างเพื่อเพิ่มรายการในคิว หากต้องการเริ่มทำงานกับคิว ให้นำเข้าคิวโมดูลก่อน ดังที่แสดงในตัวอย่างด้านล่าง
หากต้องการเพิ่ม item คุณสามารถใช้เมธอด 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.
Output:
True
ตอนนี้ขนาดของคิวคือ 5 และจะใช้เวลาไม่เกิน 5 รายการ และเมธอด q1.full() จะคืนค่าเป็นจริง การเพิ่มรายการใดๆ จะไม่รันโค้ดอีกต่อไป
ลบรายการออกจากคิว
หากต้องการลบรายการออกจากคิว คุณสามารถใช้เมธอดที่เรียกว่า get() เมธอดนี้อนุญาตให้ไอเท็มจากคิวเมื่อถูกเรียก
ตัวอย่างต่อไปนี้จะแสดงวิธีลบรายการออกจากคิว
import queue q1 = queue.Queue() q1.put(10) item1 = q1.get() print('The item removed from the queue is ', item1)
Output:
The item removed from the queue is 10
ตัวอย่างการเข้าคิวครั้งสุดท้ายเข้าก่อนออก
ในกรณีของลำดับสุดท้ายในคิวออกครั้งแรก องค์ประกอบที่ป้อนครั้งสุดท้ายจะเป็นคนแรกที่ออกมา
หากต้องการทำงานกับ LIFO เช่น อยู่ในคิวออกลำดับแรก เราจำเป็นต้องนำเข้าโมดูลคิวและใช้ประโยชน์จากเมธอด LifoQueue()
เพิ่มและรายการในคิว
ที่นี่เราจะเข้าใจวิธีการเพิ่มรายการลงในคิว LIFO
import queue q1 = queue.LifoQueue() q1.put(10)
คุณต้องใช้เมธอด put() บน LifoQueue ดังที่แสดงในตัวอย่างข้างต้น
ลบรายการออกจากคิว
หากต้องการลบรายการออกจาก LIFOqueue คุณสามารถใช้เมธอด get() ได้
import queue q1 = queue.LifoQueue() q1.put(10) item1 = q1.get() print('The item removed from the LIFO queue is ', item1)
Output:
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.
Output:
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.
Output:
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()
Output:
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()
Output:
10 3 21 4 5 11
สรุป
- คิวคือคอนเทนเนอร์ที่เก็บข้อมูล คิวมีสองประเภท FIFO และ LIFO
- สำหรับ FIFO (เข้าก่อนออกก่อน) องค์ประกอบที่ไปก่อนจะเป็นคนแรกที่ออกมา
- สำหรับ LIFO (เข้าครั้งสุดท้ายก่อนออกคิว) องค์ประกอบที่ป้อนครั้งสุดท้ายจะเป็นคนแรกที่ออกมา
- รายการในคิวจะถูกเพิ่มโดยใช้วิธีใส่ (รายการ)
- หากต้องการลบรายการออก ให้ใช้เมธอด get()