A Queue implementáció megértése Pythonban

Az adatstruktúrák kulcsszerepet játszanak a programozási világban. Segítenek abban, hogy adatainkat hatékonyan felhasználható módon rendszerezzük. A Queue az egyik legegyszerűbb elérhető adatstruktúra.

Ebben a cikkben megismerjük a Queue-t és annak Pythonban való megvalósítását.

Mi az a várólista?

A Queue egy lineáris adatstruktúra, amely a First In/First Out (FIFO) elvet követi. Ellentétes a Stack adatszerkezettel.

Összehasonlíthatjuk a sort egy valós sorral a mozijegypénztárnál. Nézzük egy sor illusztrációját a következőképpen.

Ha megfigyeli a sorban állást a pultnál, a második személy csak akkor tud a pulthoz menni, ha az első befejezte a munkáját. Itt az első ember jön a pulthoz, majd a második személy. Tehát itt az emberek a FIFO (First In/First Out) elvet követik. Aki előbb jön, az előbb fejezi be a munkát. Hasonló sorokat láthatunk mindennapi életünkben.

A Queue adatstruktúra is ugyanezt az elvet követi. Most már tudja, mik a sorok, és annak elvét. Lássuk, milyen műveleteket lehet végrehajtani egy sor adatstruktúrán.

Műveletek a sorban

Hasonlóan a veremhez, két fő műveletet találunk egy sor adatstruktúrában.

sor(adat)

A végén új adatokat ad a sorhoz. Az oldalt hátsónak hívják.

dequeue()

Eltávolítja az adatokat a sor elejéről. Az oldalt elülsőnek nevezik.

Nézzük meg a sorműveletek illusztrációit a jobb megértés érdekében. Egy kép többet mond ezer szónál.

Írhatunk néhány segítő függvényt, hogy több információt kapjunk a sorról. Nincs korlátozva a segédfunkciók száma. Maradjunk most az alábbiakban említett legfontosabbnál.

hátulsó()

Visszaadja az első elemet a sor végéről.

elülső()

A sor elejétől az első elemet adja vissza.

üres()

Visszaadja, hogy a sor üres-e vagy sem.

Nem unalmas neked? Mármint a fogalmi témákra.

Nekem igen!

De nem tehetünk semmit a fogalmak ismerete nélkül. A megvalósítás előtt tudnunk kell. Ne aggódj, ideje bepiszkítani a kezünket valamilyen kóddal.

Feltételezem, hogy a python telepítve van a számítógépére, ha nem, akkor megpróbálhatja az online fordítót is.

Sor végrehajtása

A várólista megvalósítása egy programozónak nem tart tovább 15 percnél. Ha egyszer megtanultad, elmondod. Talán néhány percen belül megvalósíthatja ezt az oktatóanyagot követően.

  Hogyan adhatunk egyéni hangulatjeleket a Discord szerverhez

A várólista Pythonban többféleképpen is implementálható. Lássuk lépésről lépésre a különböző sormegvalósításokat.

#1. Lista

A lista egy beépített adattípus a Pythonban. A lista adattípust fogjuk használni egy sor megvalósításához egy osztályban. Végigvezetjük a sor adatszerkezetének modulok nélküli, a semmiből történő megvalósításának különböző lépéseit. Ugorjunk bele.

1. lépés:

Írj egy osztályt Queue néven.

class Queue:
	pass

2. lépés:

Kell lennie valamilyen változónak a sor adatainak tárolására az osztályban. Nevezzük el elemeknek. És ez természetesen egy lista.

class Queue:

	def __init__(self):
		self.elements = []

3. lépés:

Adatok beszúrásához a sorba szükségünk van egy metódusra az osztályban. A módszer neve enqueue, amint azt az oktatóanyag előző részében már tárgyaltuk.

A metódus vesz néhány adatot, és hozzáadja a sorhoz (elemekhez). A lista adattípus append metódusát használhatjuk adatok hozzáadásához a sor végére.

class Queue:

	# ...

	def enqueue(self, data):
		self.elements.append(data)
		return data

4. lépés:

A sornak kijárattal kell rendelkeznie. És ezt hívják kimaradásnak. Azt hiszem, már sejtette, hogy a lista adattípus pop módszerét fogjuk használni. Ha kitaláltad, ha nem, egészségedre!

A lista adattípus pop metódusa töröl egy elemet az adott index listájából. Ha nem adtunk meg indexet, akkor törli a lista utolsó elemét.

Itt törölnünk kell a lista első elemét. Tehát a 0 indexet át kell adnunk a pop metódusnak.

class Queue:

	# ...

	def dequeue(self):
		return self.elements.pop(0)

Ez elég egy sorhoz. De szükségünk van a segítő függvényekre, hogy ellenőrizzük, hogy a sorműveletek megfelelően működnek-e vagy sem. Írjuk fel a segítő függvényeket is.

5. lépés:

A rear() metódus a sor utolsó elemének lekérésére szolgál. A lista adattípusú negatív indexelés segít abban, hogy megkapjuk a sor utolsó elemét.

class Queue:

	# ...

	def rear(self):
		return self.elements[-1]

6. lépés:

A front() metódus a sor első elemének lekérésére szolgál. A sor első elemét a listaindex segítségével kaphatjuk meg.

class Queue:

	# ...

	def front(self):
		return self.elements[0]

7. lépés:

Az is_empty() metódus annak ellenőrzésére szolgál, hogy a sor üres-e vagy sem. Ellenőrizhetjük a lista hosszát.

class Queue:

	# ...

	def is_empty(self):
		return len(self.elements) == 0

Fú! befejezte a sor adatstruktúra megvalósítási részét. Létre kell hoznunk egy objektumot a Queue osztály használatához.

Csináljuk.

class Queue:

	# ...

if __name__ == '__main__':
	queue = Queue()

Most van egy Queue objektum. Teszteljük néhány műveletsorral.

  • Az is_empty metódus segítségével ellenőrizze, hogy a sor üres-e vagy sem. Igaznak kell visszaadnia.
  • Adja hozzá az 1, 2, 3, 4, 5 számokat a sorhoz az enqueue módszerrel.
  • Az is_empty metódusnak False értéket kell adnia. Ellenőrizd.
  • Nyomtassa ki az elülső és a hátsó elemeket az első és a hátsó módszerrel.
  • Távolítsa el az elemet a sorból a dequeue módszerrel.
  • Ellenőrizze az elülső elemet. A 2-es elemet kell visszaadnia.
  • Most távolítsa el az összes elemet a sorból.
  • Az is_empty metódusnak True értéket kell adnia. Ellenőrizd.
  Hogyan lehet pénzt hozzáadni a Metamaskhoz

Azt hiszem, ez elég ahhoz, hogy teszteljük a sor megvalósítását. Írja be a kódot minden fent említett lépéshez a várólista teszteléséhez.

Megírtad a kódot?

Nem, ne aggódj.

Ellenőrizze az alábbi kódot.

class Queue:

	def __init__(self):
		self.elements = []

	def enqueue(self, data):
		self.elements.append(data)
		return data

	def dequeue(self):
		return self.elements.pop(0)

	def rear(self):
		return self.elements[-1]

	def front(self):
		return self.elements[0]

	def is_empty(self):
		return len(self.elements) == 0

if __name__ == '__main__':
	queue = Queue()

	## checking is_empty method -> True
	print(queue.is_empty())

	## adding the elements
	queue.enqueue(1)
	queue.enqueue(2)
	queue.enqueue(3)
	queue.enqueue(4)
	queue.enqueue(5)

	## again checking is_empty method -> False
	print(queue.is_empty())

	## printing the front and rear elements using front and rear methods respectively -> 1, 5
	print(queue.front(), end=' ')
	print(queue.rear())

	## removing the element -> 1
	queue.dequeue()

	## checking the front and rear elements using front and rear methods respectively -> 2 5
	print(queue.front(), end=' ')
	print(queue.rear())

	## removing all the elements
	queue.dequeue()
	queue.dequeue()
	queue.dequeue()
	queue.dequeue()

	## checking the is_empty method for the last time -> True
	print(queue.is_empty())

Szerintem futtasd a fenti programot. A következő eredményhez hasonló kimenetet kaphat.

True
False
1 5
2 5
True

A lista adattípust közvetlenül használhatjuk sor adatstruktúraként. A várólista fenti megvalósítása segít jobban megérteni a sor implementációját más programozási nyelveken.

Használhatja a várólista fenti osztályú implementációját egy projekt másik programjában is, ha egyszerűen létrehozza az objektumot, ahogy korábban tettük.

A sort a nulláról valósítottuk meg a lista adattípus használatával. Vannak beépített modulok a sorhoz? Igen! beépített sormegvalósításaink vannak. Lássuk őket.

#2. deque gyűjteményekből

Kétvégű várólistaként van megvalósítva. Mivel mindkét végéről támogatja az elemek hozzáadását és eltávolítását, így veremként és sorként is használhatjuk. Lássuk a sormegvalósítást a dequeue használatával.

Más adatstruktúrák segítségével valósul meg, amelyeket duplán linkelt listának neveznek. Tehát az elemek beillesztésének és törlésének teljesítménye konzisztens. A középső linkelt lista elemeinek elérése O(n) időt vett igénybe. Használhatjuk sorként, mivel nem kell a sorból elérni a középső elemeket.

  A Wine Staging telepítése Linuxra

Vizsgáljuk meg a dequeue által kínált különböző módszereket.

  • append(data) – az adatok hozzáadására szolgál a sorhoz
  • popleft() – az első elem eltávolítására szolgál a sorból

Nincsenek alternatív módszerek az elülső, a hátsó és az is_empty számára. Az elülső és hátsó metódusok helyett a teljes sort kinyomtathatjuk. Ezután a len módszerrel ellenőrizhetjük, hogy a sor üres-e vagy sem.

Az előzőekben egy sor lépést követtünk a várólista megvalósításának tesztelésére. Kövessük itt is ugyanezt a lépéssort.

from collections import deque

## creating deque object
queue = deque()

## checking whether queue is empty or not -> True
print(len(queue) == 0)

## pushing the elements
queue.append(1)
queue.append(2)
queue.append(3)
queue.append(4)
queue.append(5)

## again checking whether queue is empty or not -> False
print(len(queue) == 0)

## printing the queue
print(queue)

## removing the element -> 1
queue.popleft()

## printing the queue
print(queue)

## removing all the elements
queue.popleft()
queue.popleft()
queue.popleft()
queue.popleft()

## checking the whether queue is empty or not for the last time -> True
print(len(queue) == 0)

A következő kimenethez hasonló eredményt kap.

True
False
deque([1, 2, 3, 4, 5])
deque([2, 3, 4, 5])
True

#3. Sor a sorból

A Python rendelkezik egy queue nevű beépített modullal, amely a Queue nevű osztályt szolgálja ki a sor megvalósításához. Hasonló ahhoz, amit korábban megvalósítottunk.

Először nézzük meg a Queue osztály különböző metódusait.

  • put(data) – hozzáadja vagy elküldi az adatokat a sorba
  • get() – eltávolítja az első elemet a sorból, és visszaadja
  • üres() – visszaadja, hogy a verem üres-e vagy sem
  • qsize() – a sor hosszát adja vissza.

Valósítsuk meg a sort a fenti módszerekkel.

from queue import Queue

## creating Queue object
queue_object = Queue()

## checking whether queue is empty or not -> True
print(queue_object.empty())

## adding the elements
queue_object.put(1)
queue_object.put(2)
queue_object.put(3)
queue_object.put(4)
queue_object.put(5)

## again checking whether queue is empty or not -> False
print(queue_object.empty())

## removing all the elements
print(queue_object.get())
print(queue_object.get())
print(queue_object.get())

## checking the queue size
print("Size", queue_object.qsize())

print(queue_object.get())
print(queue_object.get())

## checking the whether queue_object is empty or not for the last time -> True
print(queue_object.empty())

Ellenőrizze a fenti kód kimenetét.

True
False
1
2
3
Size 2
4
5
True

Van néhány más metódus is a Queue osztályban. A dir beépített funkcióval fedezheti fel őket.

Következtetés

Remélem, tanult a sor adatszerkezetéről és annak megvalósításáról. Ennyit a sorról. A sort különböző helyeken használhatja, ahol FIFO (First In/First Out) sorrendben kell feldolgozni. Használja a queue-t a problémamegoldásban, amikor az esetet használja.

Érdekli a Python elsajátítása? Tekintse meg ezeket a tanulási forrásokat.

Boldog kódolást 🙂 👨‍💻