GoDasturchi
Queue Implementation

Queue Implementation

Queue (navbat) yaratish

Endi non do'koniga navbatga tizilganingizni tasavvur qiling. Kim birinchi kelgan bo'lsa, o'sha birinchi xizmat oladi — hech kim navbatning old tomonidan "o'zini urib kirmaydi". Bu — stackning aynan teskarisi.

Bu tuzilma Queue (navbat) deyiladi, uning tamoyili — FIFO: "First In, First Out" — birinchi kirgan birinchi chiqadi. Qo'shish — Enqueue ("navbatga turing"), olish — Dequeue ("navbatdan chiqing") deyiladi.

example.go
package main

import "fmt"

type Queue struct {
	items []string
}

func (q *Queue) Enqueue(v string) {
	q.items = append(q.items, v)
}

func (q *Queue) Dequeue() (string, bool) {
	if len(q.items) == 0 {
		return "", false
	}
	first := q.items[0]
	q.items = q.items[1:]
	return first, true
}

func main() {
	var q Queue
	q.Enqueue("Aziz")
	q.Enqueue("Bobur")
	q.Enqueue("Kamola")

	first, _ := q.Dequeue()
	fmt.Println(first)
}

Enqueue — Stack'dagi Push bilan bir xil: yangi kishi navbatning oxiriga qo'shiladi. Farq — Dequeueda: biz oxirgisini emas, items[0] — ro'yxatning eng boshidagi elementni olamiz, chunki u eng birinchi kelgan. So'ng q.items[1:] bilan slice'ning birinchi elementini "kesib tashlaymiz" — qolganlar bittalab oldinga siljigandek bo'ladi.

Kichik, lekin muhim ogohlantirish: items[1:] har safar chaqirilganda, Go "eski" slice'ning boshlanish nuqtasini shunchaki siljitadi — bu tez ishlaydi, lekin juda ko'p marta (masalan millionlab) Dequeue qilinsa, slice ostidagi massiv sekin-asta "chirkin" bo'lib qoladi (xotira samarasiz ishlatiladi). Katta, yuqori yukli navbatlar uchun boshqacha (masalan halqasimon bufer) tuzilma ishlatiladi, lekin o'rganish uchun bu yetarlicha sodda va to'g'ri ishlaydi.

>_ Exercise

Navbatga Peek (birinchi navbatdagini ko'rish) va IsEmpty qo'shing.

  • Peek() (string, bool) — birinchi elementni OLIB TASHLAMASDAN qaytaring
  • IsEmpty() bool — navbat bo'shligini tekshiring
  • uchta Enqueue qilib, Peek va IsEmpty natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Queue — FIFO (birinchi kirgan birinchi chiqadi) tuzilma; navbatning old tomonidan olib, orqasiga qo'shiladi — Stack'ning aynan teskarisi.

NEXT UP

Singly Linked List

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Queue Implementation

Queue (navbat) yaratish

Endi non do'koniga navbatga tizilganingizni tasavvur qiling. Kim birinchi kelgan bo'lsa, o'sha birinchi xizmat oladi — hech kim navbatning old tomonidan "o'zini urib kirmaydi". Bu — stackning aynan teskarisi.

Bu tuzilma Queue (navbat) deyiladi, uning tamoyili — FIFO: "First In, First Out" — birinchi kirgan birinchi chiqadi. Qo'shish — Enqueue ("navbatga turing"), olish — Dequeue ("navbatdan chiqing") deyiladi.

example.go
package main

import "fmt"

type Queue struct {
	items []string
}

func (q *Queue) Enqueue(v string) {
	q.items = append(q.items, v)
}

func (q *Queue) Dequeue() (string, bool) {
	if len(q.items) == 0 {
		return "", false
	}
	first := q.items[0]
	q.items = q.items[1:]
	return first, true
}

func main() {
	var q Queue
	q.Enqueue("Aziz")
	q.Enqueue("Bobur")
	q.Enqueue("Kamola")

	first, _ := q.Dequeue()
	fmt.Println(first)
}

Enqueue — Stack'dagi Push bilan bir xil: yangi kishi navbatning oxiriga qo'shiladi. Farq — Dequeueda: biz oxirgisini emas, items[0] — ro'yxatning eng boshidagi elementni olamiz, chunki u eng birinchi kelgan. So'ng q.items[1:] bilan slice'ning birinchi elementini "kesib tashlaymiz" — qolganlar bittalab oldinga siljigandek bo'ladi.

Kichik, lekin muhim ogohlantirish: items[1:] har safar chaqirilganda, Go "eski" slice'ning boshlanish nuqtasini shunchaki siljitadi — bu tez ishlaydi, lekin juda ko'p marta (masalan millionlab) Dequeue qilinsa, slice ostidagi massiv sekin-asta "chirkin" bo'lib qoladi (xotira samarasiz ishlatiladi). Katta, yuqori yukli navbatlar uchun boshqacha (masalan halqasimon bufer) tuzilma ishlatiladi, lekin o'rganish uchun bu yetarlicha sodda va to'g'ri ishlaydi.

>_ Exercise

Navbatga Peek (birinchi navbatdagini ko'rish) va IsEmpty qo'shing.

  • Peek() (string, bool) — birinchi elementni OLIB TASHLAMASDAN qaytaring
  • IsEmpty() bool — navbat bo'shligini tekshiring
  • uchta Enqueue qilib, Peek va IsEmpty natijalarini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Queue — FIFO (birinchi kirgan birinchi chiqadi) tuzilma; navbatning old tomonidan olib, orqasiga qo'shiladi — Stack'ning aynan teskarisi.

NEXT UP

Singly Linked List