Steklar


Stack - bu oxirgi kelgan birinchi chiqish (LIFO) tamoyiliga amal qiluvchi chiziqli ma’lumotlar strukturasi.

Buni pancakes to‘plami kabi tasavvur qiling - siz faqat yuqoridan krep qo‘shishingiz yoki olib tashlashingiz mumkin.


ULASHISH

Staklar

Stack - bu ko‘plab elementlarni o‘z ichiga oladigan ma’lumotlar strukturasi va oxirgi qo‘shilgan element birinchi bo‘lib o‘chiriladi.

Bir qoziq pancakes kabi, pancakes ham qo‘shiladi, ham yuqoridan chiqariladi. Shunday qilib, krepni olib tashlaganingizda, u har doim siz qo‘shgan oxirgi krep bo‘ladi. Elementlarni tartibga solishning bunday usuli LIFO: Last In First Out deb ataladi.

Biz stekda bajarishimiz mumkin bo‘lgan asosiy operatsiyalar:

  • Push: stekga yangi element qo‘shadi.
  • Pop: stekdan yuqori elementni olib tashlaydi va qaytaradi.
  • Peek: stekdagi yuqori (oxirgi) elementni qaytaradi.
  • isEmpty: stek bo‘sh yoki yo‘qligini tekshiradi.
  • Hajmi: stekdagi elementlar sonini topadi.

Stacks massivlar yoki bog‘langan listlar yordamida amalga oshirilishi mumkin.

Steklardan bekor qilish mexanizmlarini amalga oshirish, oldingi holatga qaytish, grafiklarda chuqurlikdan birinchi bo‘lib qidirish algoritmlarini yaratish yoki orqaga qaytish uchun foydalanish mumkin.

Stacks ko‘pincha navbatdagi sahifada tasvirlangan o‘xshash ma’lumotlar tuzilmasi bo‘lgan Queues bilan birga eslatib o‘tiladi.


Python ro‘yxatlari yordamida stekni amalga oshirish

Python ro‘yxatlari (va massivlar) uchun stek quyidagicha ko‘rinishi va harakat qilishi mumkin:

Add: Remove:

Python ro‘yxatlari steklarni amalga oshirish uchun zarur bo‘lgan funksionallikni yaxshi qo‘llab-quvvatlaganligi sababli, biz stek yaratishdan boshlaymiz va shu kabi bir nechta stringlar bilan stek operatsiyalarini bajaramiz:

Misol

Python ro‘yxatini stek sifatida ishlatish:

stack = [] # Push stack.append('A') stack.append('B') stack.append('C') print("Stack: ", stack) # Peek topElement = stack[-1] print("Peek: ", topElement) # Pop poppedElement = stack.pop() print("Pop: ", poppedElement) # Stack after Pop print("Stack after Pop: ", stack) # isEmpty isEmpty = not bool(stack) print("isEmpty: ", isEmpty) # Size print("Size: ",len(stack))
O‘zingiz sinab ko‘ring »

Python ro‘yxatlari stek sifatida ishlatilishi mumkin bo‘lsa-da, maxsus Stack sinfini yaratish yaxshiroq inkapsulyatsiya va qo‘shimcha funksiyalarni ta’minlaydi:

Misol

Klass yordamida stek yaratish:

class Stack:   def __init__(self):     self.stack = []   def push(self, element):     self.stack.append(element)   def pop(self):     if self.isEmpty():       return "Stack is empty"     return self.stack.pop()   def peek(self):     if self.isEmpty():       return "Stack is empty"     return self.stack[-1]   def isEmpty(self):     return len(self.stack) == 0   def size(self):     return len(self.stack) # Create a stack myStack = Stack() myStack.push('A') myStack.push('B') myStack.push('C') print("Stack: ", myStack.stack) print("Pop: ", myStack.pop()) print("Stack after Pop: ", myStack.stack) print("Peek: ", myStack.peek()) print("isEmpty: ", myStack.isEmpty()) print("Size: ", myStack.size())
Misolni ishga tushirish »

Listlar/massivlar yordamida steklarni amalga oshirish sabablari:

  • Xotira samaradorligi: massiv elementlari bog‘langan list tugunlari kabi keyingi elementlar manzilini saqlamaydi.
  • Amalga oshirish va tushunish osonroq: steklarni amalga oshirish uchun massivlardan foydalanish bog‘langan listlarni ishlatishdan ko‘ra kamroq kod talab qiladi va shuning uchun uni tushunish ham osonroq.

Staklarni amalga oshirish uchun massivlardan foydalanmaslikning sababi:

  • Ruxsat etilgan o‘lcham: massiv xotiraning belgilangan qismini egallaydi. Bu shuni anglatadiki, u kerak bo‘lgandan ko‘proq xotirani egallashi mumkin yoki massiv to‘ldirilsa, u ko‘proq elementlarni sig‘dira olmaydi.


Bog‘langan listlar yordamida stekni amalga oshirish

Bog‘langan list qandaydir ma’lumotlarga ega bo‘lgan tugunlardan va keyingi tugunga ko‘rsatgichdan iborat.

A singly linked list.

Bog‘langan ro‘yxatlardan foydalanishning katta foydasi shundaki, tugunlar xotirada bo‘sh joy bo‘lgan joyda saqlanadi, elementlar massivlarda saqlangan kabi tugunlarni bir-biridan keyin bir-biriga yaqin joyda saqlash shart emas. Bog‘langan listlarning yana bir yaxshi tomoni shundaki, tugunlarni qo‘shish yoki o‘chirishda ro‘yxatdagi qolgan tugunlarni siljitish shart emas.

Steklarni amalga oshirish uchun massivlar yoki bog‘langan ro‘yxatlardan foydalanishning afzalliklarini yaxshiroq tushunish uchun massivlar va bog‘langan listlar xotirada qanday saqlanishini tushuntiruvchi ushbu sahifani ko‘rib chiqishingiz kerak.

Bog‘langan list yordamida stekni shunday amalga oshirish mumkin.

Misol

Bog‘langan ro‘yxat yordamida stek yaratish:

class Node:   def __init__(self, value):     self.value = value     self.next = None class Stack:   def __init__(self):     self.head = None     self.size = 0   def push(self, value):     new_node = Node(value)     if self.head:       new_node.next = self.head     self.head = new_node     self.size += 1   def pop(self):     if self.isEmpty():       return "Stack is empty"     popped_node = self.head     self.head = self.head.next     self.size -= 1     return popped_node.value   def peek(self):     if self.isEmpty():       return "Stack is empty"     return self.head.value   def isEmpty(self):     return self.size == 0   def stackSize(self):     return self.size   def traverseAndPrint(self):     currentNode = self.head     while currentNode:       print(currentNode.value, end=" -> ")       currentNode = currentNode.next     print() myStack = Stack() myStack.push('A') myStack.push('B') myStack.push('C') print("LinkedList: ", end="") myStack.traverseAndPrint() print("Peek: ", myStack.peek()) print("Pop: ", myStack.pop()) print("LinkedList after Pop: ", end="") myStack.traverseAndPrint() print("isEmpty: ", myStack.isEmpty()) print("Size: ", myStack.stackSize())
Misolni ishga tushirish »

Staklarni amalga oshirish uchun bog‘langan ro‘yxatlardan foydalanishning sababi:

  • Dinamik o‘lcham: stek massivlardan farqli o‘laroq, dinamik ravishda o‘sishi va qisqarishi mumkin.

Stacklarni amalga oshirish uchun bog‘langan ro‘yxatlardan foydalanmaslik sabablari:

  • Qo‘shimcha xotira: Har bir stek elementi keyingi elementga (keyingi bog‘langan list tuguniga) manzilni o‘z ichiga olishi kerak.
  • O‘qilishi: Ba’zilar uchun kodni o‘qish va yozish qiyinroq bo‘lishi mumkin, chunki u uzoqroq va murakkabroq.

Umumiy stack ilovalari

Stacks ko‘plab real stsenariylarda qo‘llaniladi:

  • Matn muharrirlarida bekor qilish/qayta bajarish amallari
  • Brauzer tarixi (orqaga/oldinga)
  • Dasturlashda funksiya chaqiruvi stegi
  • Ifodani baholash

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!