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.
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.
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
$ go run main.go
Kodingizni ishga tushiring