Python قائمة الانتظار: FIFO، مثال LIFO

ما هي تفاصيل Python طابور؟

قائمة الانتظار هي حاوية تحتوي على البيانات. ستتم إزالة البيانات التي تم إدخالها أولاً أولاً، ومن ثم تُسمى قائمة الانتظار أيضًا "الوارد أولاً يخرج أولاً" (FIFO). قائمة الانتظار لها طرفان أمامي وخلفي. يتم إدخال العناصر من الخلف وإزالتها من الجانب الأمامي.

كيف Python العمل في قائمة الانتظار؟

يمكن بسهولة مقارنة قائمة الانتظار بالمثال الواقعي، وهو صف الأشخاص الذين ينتظرون في قائمة الانتظار عند شباك التذاكر، والشخص الذي يقف أولاً سيحصل على التذكرة أولاً، يليه الشخص التالي، وهكذا. ينطبق نفس المنطق على بنية بيانات قائمة الانتظار أيضًا.

فيما يلي تمثيل تخطيطي لقائمة الانتظار:

Python عمل قائمة الانتظار

أكثر من خلفي يمثل النقطة التي يتم فيها إدراج العناصر داخل قائمة الانتظار. في هذا المثال، 7 هي القيمة لذلك.

أكثر من جبهة يمثل النقطة التي ستتم فيها إزالة العناصر من قائمة الانتظار. إذا قمت بإزالة عنصر من قائمة الانتظار، فإن العنصر الأول الذي ستحصل عليه هو 1، كما هو موضح في الشكل.

كان العنصر 1 هو أول عنصر يتم إدراجه في قائمة الانتظار، وأثناء إزالته يكون أول عنصر يخرج. ومن هنا تسمى قائمة الانتظار "الوارد أولاً يخرج أولاً" (FIFO)

Python عمل قائمة الانتظار

في قائمة الانتظار، تتم إزالة العناصر بالترتيب ولا يمكن إزالتها من المنتصف. لا يمكنك إزالة العنصر 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:

  • وضع (البند): سيؤدي هذا إلى وضع العنصر داخل قائمة الانتظار.
  • يحصل(): سيؤدي هذا إلى إرجاع عنصر من قائمة الانتظار.
  • فارغ(): سيعود صحيحًا إذا كانت قائمة الانتظار فارغة وخطأ إذا كانت العناصر موجودة.
  • حجم (): إرجاع حجم قائمة الانتظار.
  • ممتلىء(): يعود صحيحًا إذا كانت قائمة الانتظار ممتلئة، وإلا يعود خطأ.

مثال على قائمة انتظار الوارد أولاً يخرج أولاً

في حالة ما يدخل أولاً يخرج أولاً، فإن العنصر الذي يذهب أولاً سيكون أول من يخرج.

إضافة وعنصر في قائمة الانتظار

دعونا نعمل على مثال لإضافة عنصر في قائمة الانتظار. لبدء العمل مع قائمة الانتظار، قم أولاً باستيراد قائمة انتظار الوحدة النمطية، كما هو موضح في المثال أدناه.

لإضافة عنصر، يمكنك الاستفادة من طريقة 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()‎ صحيحًا. لن تؤدي إضافة المزيد من العناصر إلى تنفيذ التعليمات البرمجية بعد ذلك.

إزالة عنصر من قائمة الانتظار

لإزالة عنصر من قائمة الانتظار، يمكنك استخدام الطريقة المسماة 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، أي الأخير في قائمة انتظار الخروج الأول، نحتاج إلى استيراد وحدة قائمة الانتظار والاستفادة من طريقة 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)

الإخراج:

The item removed from the LIFO queue is  10

إضافة أكثر من عنصر واحد في قائمة الانتظار

في الأمثلة المذكورة أعلاه، رأينا كيفية إضافة عنصر واحد وإزالة العنصر لـ FIFO وLIFOqueue. سنرى الآن كيفية إضافة أكثر من عنصر وإزالته أيضًا.

إضافة وعنصر في قائمة انتظار FIFO

import queue
q1 = queue.Queue()

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

إزالة عنصر من قائمة انتظار 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.

الإخراج:

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

إضافة وعنصر في قائمة انتظار LIFO

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 (قائمة انتظار الوارد أولاً يخرج أولاً)، سيكون العنصر الذي تم إدخاله أخيرًا هو أول العنصر الذي يخرج.
  • تتم إضافة عنصر في قائمة الانتظار باستخدام طريقة put(item).
  • لإزالة عنصر ما، يتم استخدام طريقة get().

تلخيص هذه التدوينة بـ: