Stack Implementation
Stack (uyum) yaratish
Uyga kirganingizda eshik oldiga qo'ygan poyabzallaringizni tasavvur qiling. Har safar yangi juftlik qo'yganingizda, u eng ustiga tushadi. Va kimdir poyabzal olmoqchi bo'lsa, eng qulay yo'l — eng ustidagisini olish, chunki pastdagilarni olish uchun ustidagilarni ko'chirish kerak bo'lardi.
Aynan shu tamoyil — Stack (uyum, "to'plam" ma'nosida). Uning rasmiy nomi LIFO: "Last In, First Out" — oxirgi qo'shilgan birinchi olinadi. Stack'ga qiymat qo'shish — Push ("suring, qo'ying"), qiymat olish — Pop ("chiqarib oling") deyiladi. Yana bitta muhim amal bor — Peek ("ko'z tashlash"): eng ustidagi qiymatni olib tashlamasdan, faqat ko'rish.
Go'da stack yasash uchun maxsus tur shart emas — oddiy slice yetarli, chunki slice'ning oxiriga qo'shish va oxiridan olish allaqachon tez va oson.
package main
import "fmt"
type Stack struct {
items []int
}
func (s *Stack) Push(v int) {
s.items = append(s.items, v)
}
func (s *Stack) Pop() (int, bool) {
if len(s.items) == 0 {
return 0, false
}
last := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return last, true
}
func main() {
var s Stack
s.Push(1)
s.Push(2)
s.Push(3)
v, _ := s.Pop()
fmt.Println(v)
}Push juda oddiy: append bilan slice oxiriga qiymat qo'shiladi — poyabzalni ustiga qo'yishga o'xshaydi. Pop esa bir oz ko'proq ish qiladi: avval eng oxirgi elementni (items[len(items)-1]) "eslab qoladi", so'ng slice'ni bitta qisqartiradi (items[:len(items)-1]) — ya'ni o'sha elementni ro'yxatdan olib tashlaydi. Natijada uchtasidan oxirgi qo'shilgan 3 emas, chiqarilganda 3 qaytadi (chunki oxirgi Push — Push(3) edi).
Nega natija ikkita qiymat (int, bool) shaklida qaytadi? Chunki stack bo'sh bo'lishi mumkin — bunday holda qaysi sonni qaytarish kerak? Hech qanday son to'g'ri kelmaydi. Shuning uchun ikkinchi qiymat — bool — "bu natija haqiqiy qiymatmi, yoki stack shunchaki bo'sh edimi" degan savolga javob beradi. Bu naqshni siz "Multiple Return Values" darsida ko'rgan edingiz.
>_ Exercise
Stack'ga Peek metodini qo'shing.
- •Peek() (int, bool) metodini yozing: eng ustidagi qiymatni OLIB TASHLAMASDAN qaytaring
- •stack bo'sh bo'lsa (0, false) qaytaring
- •uchta Push'dan keyin Peek qiling, so'ng Pop qiling va ikkalasini ham chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Stack — LIFO (oxirgi kirgan birinchi chiqadi) tuzilma; Go'da uni oddiy slice + Push/Pop/Peek metodlari bilan osongina yasash mumkin.
NEXT UP
Queue Implementation
$ go run main.go
Kodingizni ishga tushiring