# Stack

To’plamlar bilan tanishishda davom etamiz. Biz o’rganadigan yangi to’plam – **Stack** avvalgilaridan boshqacharoq xossalarga ega. Stack shunday to’plamki, unga yangi elementni faqat ustidan qo’shish mumkin, elementni undagi elementni olib tashlash ham uning ustidan bajariladi. Shuning uchun Stack ni *LIFO* (*Last In First Out*) collection deb ham aytiladi. Ya’ni, **Stack**ga eng oxiri qo’shilgan element undan eng birinchi bo’lib chiqib ketadi.

**Stack**ni yaxshiroq tasavvur qilishingiz uchun hayotiy misol sifatida rasmdagi idishga solingan sharlarni misol qilib keltirishimiz mumkin:

![Stackga misol - idishdagi sharchalar](https://user-images.githubusercontent.com/91861166/138088109-0772ccdb-fd2f-48c8-9148-2268e6a8718f.jpg)

Sharchalardan birorta olishimiz kerak bo’lsa faqat eng ustidan boshlab olish imkoniyatimiz bor(o’rtasidan yoki oxiridan emas). Yangi sharchani qo’ymoqchi bo’lsak ham eng ustiga qo’ya olamiz. Demak biz **Stack** to’plami ustida quyidagi amallarni bajara olamiz:

**Push()** – **Stack**ga yangi element qo’shadi. Element Stackga eng yuqorisidan qo’shiladi (huddi quyidagi rasmdagidek);

**Pop()** – **Stack**ga oxirgi qo’shilgan element qiymatini qaytarib, bu elementni Stackdan olib tashlaydi. Elementni olib tashlanayotganda oxiri qo’shilgani birinchi bo’lib chiqib ketadi;

**Peek()** – **Stack**ning eng yuqorisidagi (oxirgi qo’shilgan) element qiymatini qaytaradi, lekin Stackdan olib tashlamaydi;

**Count** – **Stack**dagi elementlar sonini qaytaradi;

**Clear()** – **Stack**dagi barcha elementlarni o’chirib yuboradi. Bundan so’ng Stackdagi elementlar soni 0 ga teng bo’lib qoladi;

**Contains()** – **Stack**da biror element bor yoki yo’qligini tekshiradi. Bor bo’lsa *true*, yo’q bo’lsa *false* qiymat qaytaradi.

![Push va Pop amallari](https://user-images.githubusercontent.com/91861166/138085847-b8285bf1-dc86-483e-9ab6-e42b91ad4d62.jpg)

Savol tug’ilishi mumkin: Shuncha cheklovlarga ega bo’lgan to’plam dasturlashda nima uchun kerak? Biror qulayligi bormi? Albatta. Masalan, siz ko’p marta ishlatadigan **Undo/Redo** (**Ctrl+Z/Ctrl+Y**) ni ishlatganingizda bajargan ishlaringizni Stackga yozib boradi. **Ctrl+Z** qilganingizda oxirgi qilgan amalingiz birinchi bo’lib orqaga qaytadi va boshqa bo’sh stackga joylanadi (ikkinchi stack **Ctrl+Y** qilganingizda kerak bo’ladi). Yoki yana bir misol brauzeringizdagi avvalgi yoki keyingi ochilgan web-sahifalarga o'tish uchun ishlatiladigan **back/forward** tugmachalari ham **Stack** yordamida ishlaydi.

![back va forward tugmachalari](https://user-images.githubusercontent.com/91861166/147650547-33ad91b4-d58b-4f47-825d-37b0bcd04f21.png)

**Stack** haqida tushunchaga ega bo’lgan bo’lsangiz endi uni kodda ishlashini ham ko’raylik. **Stack** to’plami `System.Collections.Generic` nomlar makonida joylashgani uchun avval shu nomlar makonini chaqirishimiz kerak bo’ladi:

```csharp
using System;
using System.Collections;
using System.Collections.Generic;
public class program
{
  public static void Main()
  {
    //yangi bo'sh Stackni e'lon qilish
    var sonlar=new Stack <int>();
        
    //Stackga yangi elementlarni qo'shish
    sonlar.Push(2);
    sonlar.Push(5);
    sonlar.Push(7);
        
    //Stackdagi elementlar soni:
    Console.WriteLine(sonlar.Count);  //3 
        
    //Stackdan oxirgi qo'shilgan element qiymatini pop() orqali olish
    int b=sonlar.Pop();  //7 ga teng element Stackdan chiqib ketdi
    Console.WriteLine("b="+b);
    Console.WriteLine("Elementlar soni: "+sonlar.Count); //2
        
    //Stackdan oxirgi qo'shilgan element qiymatini peek() orqali olish
    int c=sonlar.Peek();  //Stackdagi elementlar soni o’zgarmadi
    Console.WriteLine("c="+c);
    Console.WriteLine("Elementlar soni: "+sonlar.Count);
        
    Console.ReadKey();
  }
}
```

output:

```
b=7
Elementlar soni: 2
c=5
Elementlar soni: 2
```

Shuning bilan darsimiz nihoyasiga yetdi. Agar Stack to'plamini sizga yaxshi tushuntira olgan bo'lsam xursandman. E'tiboringiz uchun rahmat.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dot-net.uz/c-.net/basic/yuqori-daraja/toplamlar/stack.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
