Stek ma'lumotlar tuzilmasi
Stek (Stack) — bu LIFO (Last In First Out — oxirgi kirgan birinchi chiqadi) tamoyiliga qat'iy amal qiluvchi chiziqli ma'lumotlar tuzilmasidir. Bu shuni anglatadiki, stekka eng oxirgi kiritilgan element undan eng birinchi bo'lib chiqariladi.
Stekni ustma-ust terilgan likopchalar taxlami (pile of plates) kabi tasavvur qilish mumkin:

Bu yerda siz:
Dasturlash terminologiyasida:

Yuqoridagi rasmda 3-element eng oxirida qo'yilgan bo'lsa-da, u eng birinchi bo'lib olib tashlandi. Bu LIFO prinsipining yaqqol amaliy ko'rinishidir.
Biz stekni Go, Python, Java, C, C++ kabi istalgan dasturlash tilida yaratishimiz mumkin, ammo ularning ishlash mantig'i va spetsifikatsiyasi mutlaqo bir xil bo'lib qoladi.
Stek ustida amallar bajarish uchun quyidagi asosiy funksiyalardan foydalaniladi:
Operatsiyalar quyidagi tartibda bajariladi:

TOP = -1 qilib boshlanadi.TOP indeksi 1 ga oshiriladi (TOP = TOP + 1), so'ngra yangi element TOP ko'rsatayotgan joyga yoziladi.TOP ko'rsatkichidagi element qiymati qaytariladi va TOP indeksi 1 ga kamaytiriladi (TOP = TOP - 1).Stekni amalga oshirishning eng keng tarqalgan usuli massivlardan (yoki dinamik massiv / slice) foydalanishdir. Quyida birinchi o'rinda Go, so'ngra Python, Java, C va C++ tillaridagi to'liq yechim keltirilgan:
package main
import (
"errors"
"fmt"
)
// Stack strukturasi
type Stack struct {
items []int
}
// Push - element qo'shish
func (s *Stack) Push(item int) {
s.items = append(s.items, item)
fmt.Printf("Qo'shildi: %d\n", item)
}
// IsEmpty - stek bo'shligini tekshirish
func (s *Stack) IsEmpty() bool {
return len(s.items) == 0
}
// Pop - eng yuqoridagi elementni o'chirish va qaytarish
func (s *Stack) Pop() (int, error) {
if s.IsEmpty() {
return 0, errors.New("stek bo'sh (Stack Underflow)")
}
topIndex := len(s.items) - 1
poppedItem := s.items[topIndex]
s.items = s.items[:topIndex]
return poppedItem, nil
}
// Peek - eng yuqoridagi element qiymatini ko'rish
func (s *Stack) Peek() (int, error) {
if s.IsEmpty() {
return 0, errors.New("stek bo'sh")
}
return s.items[len(s.items)-1], nil
}
// PrintStack - stek holatini chop etish
func (s *Stack) PrintStack() {
fmt.Println("Stek:", s.items)
}
func main() {
stack := &Stack{}
stack.Push(1)
stack.Push(2)
stack.Push(3)
stack.Push(4)
stack.PrintStack()
popped, err := stack.Pop()
if err == nil {
fmt.Printf("Olib tashlangan element: %d\n", popped)
}
fmt.Println("Element olib tashlangandan so'ng:")
stack.PrintStack()
}Massivga asoslangan stekda barcha asosiy amallar:
push(): O(1) — doimiy vaqtpop(): O(1) — doimiy vaqtisEmpty(): O(1) — doimiy vaqtisFull(): O(1) — doimiy vaqtpeek(): O(1) — doimiy vaqtChunki bu amallarda qidiruv talab etilmaydi, faqatgina TOP indeksi orqali to'g'ridan-to'g'ri elementga murojaat qilinadi.
Garchi stekni amalga oshirish juda sodda bo'lsa-da, u kompyuter tizimlarida juda qudratli vositadir:
push qilib, so'ngra birma-bir pop qilinsa, LIFO prinsipi sababli so'z teskari tartibda chiqadi.2 + 4 / 5 * (7 - 9)) hisoblashda qavslarning to'g'ri ochilib-yopilishini tekshirish (Parentheses Balancing) hamda ularni prefiks/postfiks shakllarga o'tkazishda stekdan foydalanadi.Ctrl + Z (Undo / Bekor qilish) buyrug'i oxirgi qilingan amallarni stekda saqlash hisobiga ishlaydi.package main
import "fmt"
func main() {
// Go tilida slice yordamida Stek (Stack) yaratish
var stack []string
// Push amallari
stack = append(stack, "Google")
stack = append(stack, "YouTube")
stack = append(stack, "GoDasturchi.uz")
fmt.Println("Brauzer tarixi (Stek):", stack)
// Pop amali (Back tugmasi)
topIndex := len(stack) - 1
current := stack[topIndex]
stack = stack[:topIndex]
fmt.Printf("Orqaga qaytildi: %s dan chiqdik\n", current)
fmt.Println("Hozirgi sahifa:", stack[len(stack)-1])
fmt.Println("Qolgan tarix:", stack)
}