Navbatlar


Navbat - bu birinchi kelgan birinchi chiqish (FIFO) tamoyiliga amal qiluvchi chiziqli ma’lumotlar strukturasi.


ULASHISH

Navbatlar

Navbatni supermarketda navbatda turgan odamlar deb tasavvur qiling.

Navbatga birinchi bo‘lib kelgan odam ham birinchi bo‘lib pul to‘lay oladi va supermarketni tark etadi.

Navbatda bajarishimiz mumkin bo‘lgan asosiy operatsiyalar:

  • Navbat: Navbatga yangi element qo‘shadi.
  • Dequeue: Navbatdan birinchi (old) elementni olib tashlaydi va qaytaradi.
  • Peek: Navbatdagi birinchi elementni qaytaradi.
  • isEmpty: navbat bo‘sh yoki yo‘qligini tekshiradi.
  • Hajmi: Navbatdagi elementlar sonini topadi.

Navbatlar massivlar yoki bog‘langan listlar yordamida amalga oshirilishi mumkin.

Navbatlar ofis printeri uchun ishni rejalashtirishni amalga oshirish, elektron chiptalar uchun tartiblarni qayta ishlash yoki grafiklarda birinchi bo‘lib qidirish algoritmlarini yaratish uchun ishlatilishi mumkin.

Navbatlar ko‘pincha Stacks bilan birga eslatib o‘tiladi, bu avvalgi sahifada tasvirlangan o‘xshash ma’lumotlar tuzilmasi.


Python ro‘yxatlari yordamida navbatni amalga oshirish

Python ro‘yxatlari (va massivlar) uchun Queue quyidagicha ko‘rinishi va o‘zini tutishi mumkin:

Add: Remove:

Python ro‘yxatlari navbatlarni amalga oshirish uchun zarur bo‘lgan funksionallikni yaxshi qo‘llab-quvvatlaganligi sababli, biz navbat yaratishdan boshlaymiz va bir nechta qatorlar bilan navbat operatsiyalarini bajaramiz:

Misol

Python ro‘yxatidan navbat sifatida foydalanish:

queue = [] # Enqueue queue.append('A') queue.append('B') queue.append('C') print("Queue: ", queue) # Peek frontElement = queue[0] print("Peek: ", frontElement) # Dequeue poppedElement = queue.pop(0) print("Dequeue: ", poppedElement) print("Queue after Dequeue: ", queue) # isEmpty isEmpty = not bool(queue) print("isEmpty: ", isEmpty) # Size print("Size: ", len(queue))
O‘zingiz sinab ko‘ring »

Eslatma: Ro‘yxatni ishlatish oddiy bo‘lsa-da, elementlarni boshidan olib tashlash (navbatdan chiqarish operatsiyasi) qolgan barcha elementlarni siljitishni talab qiladi, bu esa katta navbatlar uchun unchalik samarali emas.



Navbat sinfini amalga oshirish

Queue sinfining to‘liq amalga oshirilishi:

Misol

Python sinfidan navbat sifatida foydalanish:

class Queue:   def __init__(self):     self.queue = []        def enqueue(self, element):     self.queue.append(element)   def dequeue(self):     if self.isEmpty():       return "Queue is empty"     return self.queue.pop(0)   def peek(self):     if self.isEmpty():       return "Queue is empty"     return self.queue[0]   def isEmpty(self):     return len(self.queue) == 0   def size(self):     return len(self.queue) # Create a queue myQueue = Queue() myQueue.enqueue('A') myQueue.enqueue('B') myQueue.enqueue('C') print("Queue: ", myQueue.queue) print("Peek: ", myQueue.peek()) print("Dequeue: ", myQueue.dequeue()) print("Queue after Dequeue: ", myQueue.queue) print("isEmpty: ", myQueue.isEmpty()) print("Size: ", myQueue.size())
O‘zingiz sinab ko‘ring »

Bog‘langan listlar yordamida navbatni amalga oshirish

Bog‘langan list qandaydir ma’lumotlarga ega bo‘lgan tugunlardan va keyingi tugunga ko‘rsatgichdan iborat.

A singly linked list.

Bog‘langan ro‘yxatlardan foydalanishning katta foydasi shundaki, tugunlar xotirada bo‘sh joy bo‘lgan joyda saqlanadi, elementlar massivlarda saqlangan kabi tugunlarni bir-biridan keyin bir-biriga yaqin joyda saqlash shart emas. Bog‘langan listlarning yana bir yaxshi tomoni shundaki, tugunlarni qo‘shish yoki o‘chirishda ro‘yxatdagi qolgan tugunlarni siljitish shart emas.

Navbatlarni amalga oshirish uchun massivlar yoki bog‘langan ro‘yxatlardan foydalanishning afzalliklarini yaxshiroq tushunish uchun massivlar va bog‘langan listlar xotirada qanday saqlanishini tushuntiruvchi ushbu sahifani ko‘rib chiqishingiz kerak.

Bog‘langan list yordamida navbatni shunday amalga oshirish mumkin.

Misol

Bog‘langan ro‘yxat yordamida navbat (Queue) yaratish:

class Node:   def __init__(self, data):     self.data = data     self.next = None class Queue:   def __init__(self):     self.front = None     self.rear = None     self.length = 0   def enqueue(self, element):     new_node = Node(element)     if self.rear is None:       self.front = self.rear = new_node       self.length += 1       return     self.rear.next = new_node     self.rear = new_node     self.length += 1   def dequeue(self):     if self.isEmpty():       return "Queue is empty"     temp = self.front     self.front = temp.next     self.length -= 1     if self.front is None:       self.rear = None     return temp.data   def peek(self):     if self.isEmpty():       return "Queue is empty"     return self.front.data   def isEmpty(self):     return self.length == 0   def size(self):     return self.length   def printQueue(self):     temp = self.front     while temp:       print(temp.data, end=" -> ")       temp = temp.next     print() # Create a queue myQueue = Queue() myQueue.enqueue('A') myQueue.enqueue('B') myQueue.enqueue('C') print("Queue: ", end="") myQueue.printQueue() print("Peek: ", myQueue.peek()) print("Dequeue: ", myQueue.dequeue()) print("Queue after Dequeue: ", end="") myQueue.printQueue() print("isEmpty: ", myQueue.isEmpty()) print("Size: ", myQueue.size())
O‘zingiz sinab ko‘ring »

Navbatlarni amalga oshirish uchun bog‘langan ro‘yxatlardan foydalanish sabablari:

  • Dinamik o‘lcham: navbat massivlardan farqli o‘laroq, dinamik ravishda o‘sishi va qisqarishi mumkin.
  • O‘zgartirish yo‘q: Navbatning oldingi elementi xotiradagi boshqa elementlarni siljitmasdan olib tashlanishi (dequeue) mumkin.

Navbatlarni amalga oshirish uchun bog‘langan ro‘yxatlardan foydalanmaslik sabablari:

  • Qo‘shimcha xotira: Har bir navbat elementi keyingi elementga (keyingi bog‘langan list tuguniga) manzilni o‘z ichiga olishi kerak.
  • O‘qilishi: Ba’zilar uchun kodni o‘qish va yozish qiyinroq bo‘lishi mumkin, chunki u uzoqroq va murakkabroq.

Umumiy navbat ilovalari

Navbatlar ko‘plab real stsenariylarda qo‘llaniladi:

  • Operatsion tizimlarda vazifalarni rejalashtirish
  • Grafiklarda kenglik-birinchi qidiruv
  • Tarqalgan tizimlarda xabarlar navbatlari

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!