GoDasturchi
Stack Implementation

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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