DSA navbatlar


ULASHISH

Navbatlar

Navbat — ko‘plab elementlarni saqlay oladigan ma’lumotlar tuzilmasi.

Out sign
{{ x.dieNmbr }}
In sign

{{ resultText }}: {{ currVal }}

Navbatni supermarketda navbatda turgan odamlar deb tasavvur qiling.

Navbatga birinchi turgan odam birinchi bo‘lib to‘lov qilib, supermarketdan chiqib keta oladi. Elementlarni bunday tartibda tashkil etish FIFO deb ataladi: First In First Out (birinchi kirgan birinchi chiqadi).

Navbat ustida bajarishimiz mumkin bo‘lgan asosiy amallar:

  • Enqueue: Navbatga yangi element qo‘shadi.
  • Dequeue: Navbatdagi birinchi (eng oldingi) elementni olib tashlaydi va qaytaradi.
  • Peek: Navbatdagi birinchi elementni qaytaradi.
  • isEmpty: Navbat bo‘sh yoki bo‘sh emasligini tekshiradi.
  • Size: Navbatdagi elementlar sonini aniqlaydi.

Yuqoridagi navbat animatsiyasida ushbu asosiy amallarni sinab ko‘ring.

Navbatlarni massivlar yoki bog‘langan ro‘yxatlar yordamida amalga oshirish mumkin.

Navbatlardan ofis printeri uchun vazifalarni rejalashtirishda, elektron chiptalar bo‘yicha buyurtmalarni qayta ishlashda yoki graflarda kenglik bo‘yicha qidiruv algoritmlarini yaratishda foydalanish mumkin.

Navbatlar ko‘pincha steklar bilan birga tilga olinadi. Stek — oldingi sahifada tasvirlangan o‘xshash ma’lumotlar tuzilmasi.



Navbatni massivlar yordamida amalga oshirish

Navbatlarni amalga oshirishda massivlar yoki bog‘langan ro‘yxatlardan foydalanishning afzalliklarini yaxshiroq tushunish uchun massivlar va bog‘langan ro‘yxatlar xotirada qanday saqlanishini tushuntiruvchi ushbu sahifani ko‘rib chiqing.

Massivdan navbat sifatida foydalanganimizda u quyidagicha ko‘rinadi:

[
{{ x.dieNmbr }},
]

{{ resultText }}: {{ currVal }}

Navbatlarni massivlar yordamida amalga oshirish sabablari:

  • Xotirani tejaydi: Massiv elementlari bog‘langan ro‘yxat tugunlari kabi keyingi elementning manzilini saqlamaydi.
  • Amalga oshirish va tushunish osonroq: Navbatlarni massivlar yordamida amalga oshirish bog‘langan ro‘yxatlardan foydalanishga qaraganda kamroq kod talab qiladi va shu sababli odatda tushunish ham osonroq.

Navbatlarni amalga oshirishda massivlardan foydalanmaslik sabablari:

  • Qat’iy o‘lcham: Massiv xotiraning belgilangan qismini egallaydi. Bu shuni anglatadiki, u keragidan ko‘proq xotira egallashi mumkin yoki massiv to‘lib qolsa, unga boshqa element sig‘maydi. Massiv o‘lchamini o‘zgartirish esa qimmatga tushishi mumkin.
  • Siljitish xarajati: Dequeue navbatdagi birinchi elementni olib tashlaydi va qolgan elementlar olib tashlangan element o‘rnini egallash uchun siljitilishi kerak. Bu samarasiz va, ayniqsa, navbat uzun bo‘lsa, muammolarga olib kelishi mumkin.
  • Muqobillar: Ba’zi dasturlash tillarida navbat amallari uchun optimallashtirilgan, massivlardan foydalanishdan ko‘ra yaxshiroq bo‘lgan o‘rnatilgan ma’lumotlar tuzilmalari mavjud.

Eslatma: Ushbu darslikda Python’da massivlardan foydalanganda aslida Python’ning 'list' ma’lumot turidan foydalanamiz, ammo ushbu darslik doirasida 'list' ma’lumot turidan massiv kabi foydalanish mumkin. Python ro‘yxatlari (list) haqida bu yerda ko‘proq bilib oling.

Python ro‘yxatlari navbatlarni amalga oshirish uchun kerakli funksionallikni yaxshi qo‘llab-quvvatlagani sababli, navbat yaratish va navbat amallarini bajarishni atigi bir necha qator kod bilan boshlaymiz:

Misol

Python:

queue = []

# Enqueue
queue.append('A')
queue.append('B')
queue.append('C')
print("Queue: ", queue)

# Dequeue
element = queue.pop(0)
print("Dequeue: ", element)

# Peek
frontElement = queue[0]
print("Peek: ", frontElement)

# isEmpty
isEmpty = not bool(queue)
print("isEmpty: ", isEmpty)

# Size
print("Size: ", len(queue))
O‘zingiz sinab ko‘ring »

Biroq navbatlar uchun asosiy amallarga ega ma’lumotlar tuzilmasini aniq yaratish uchun buning o‘rniga navbat sinfini (class) yaratishimiz kerak. Python’da navbatlarni bu tarzda yaratish C va Java kabi boshqa dasturlash tillarida navbatlar yaratilishiga ham ko‘proq o‘xshaydi.

Misol

Python:

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("Dequeue: ", myQueue.dequeue())

print("Peek: ", myQueue.peek())

print("isEmpty: ", myQueue.isEmpty())

print("Size: ", myQueue.size())
O‘zingiz sinab ko‘ring »

Navbatni bog‘langan ro‘yxatlar yordamida amalga oshirish

Navbatlarni bog‘langan ro‘yxatlar yordamida amalga oshirish sabablari:

  • Dinamik o‘lcham: Massivlardan farqli ravishda, navbat dinamik ravishda kattalashishi va kichrayishi mumkin.
  • Siljitishsiz: Navbatning oldingi elementini xotiradagi boshqa elementlarni siljitmasdan olib tashlash (dequeue) mumkin.

Navbatlarni amalga oshirishda bog‘langan ro‘yxatlardan foydalanmaslik sabablari:

  • Qo‘shimcha xotira: Har bir navbat elementi keyingi elementning (bog‘langan ro‘yxatdagi keyingi tugunning) manzilini saqlashi kerak.
  • O‘qilishi: Kod uzunroq va murakkabroq bo‘lgani uchun ba’zilarga uni o‘qish va yozish qiyinroq bo‘lishi mumkin.

Navbatni bog‘langan ro‘yxat yordamida quyidagicha amalga oshirish mumkin.

Misol

Python:

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("Dequeue: ", myQueue.dequeue())

print("Peek: ", myQueue.peek())

print("isEmpty: ", myQueue.isEmpty())

print("Size: ", myQueue.size())
O‘zingiz sinab ko‘ring »

DSA mashqlari

Mashqlar yordamida o‘zingizni sinang

Mashq:

Quyidagi massiv navbat ma’lumotlar tuzilmasi sifatida ishlatiladi:

[5,11,8,3]

endueue va dedueue amallari qaysi indekslar va qiymatlarga ta’sir qiladi?

enqueue(7): 
    value 7 is placed on 
    index  in the array.

dequeue(): 
    value  is taken 
    out of the queue.

Mashqni boshlash



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!