60 / 90

C++ std::stack

C++ std::stack (Stek)

STL stack C++ da stek ma'lumotlar strukturasining funksionalligini ta'minlaydi.

stack ma'lumotlar strukturasi LIFO (Oxirgi kirish birinchi chiqish) tamoyiliga amal qiladi. Ya'ni, oxirgi qo'shilgan element birinchi bo'lib o'chiriladi.

Stack Data Structure

In stack, the element added last is removed first.

To learn more about stacks, visit our tutorial on Stack Data Structure.

Stack yarating

C++ da stek yaratish uchun avval stack sarlavha faylini kiritishimiz kerak.

example.cpp
#include <stack>

Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida stack yaratishimiz mumkin:

example.cpp
stack<type> st;

Bu erda type biz stekda saqlamoqchi bo'lgan ma'lumotlar turini ko'rsatadi. Masalan; misol uchun,

example.cpp
// butun sonlar to'plamini yarating
stack<int> integer_stack;

// satrlar to'plamini yarating
stack<string> string_stack;

Misol: C++ STL stack

example.cpp
#include <iostream>
#include <stack>
using namespace std;

int main() {
    // satrlar to'plamini yarating
    stack<string> languages;
    
    // Stackga element qo'shing
    languages.push("C++");
    languages.push("Java");
    languages.push("Python");
    
    // yuqori elementni chop etish
    cout << languages.top();

    return 0;
}

Chiqish

kod
Python

Yuqoridagi misolda biz tillar deb nomlangan stack qatorlarni yaratdik.

Bu erda biz stekga elementlar qo'shish uchun push() usulidan foydalandik. Keyin yuqori elementni ko'rsatish uchun top() usulidan foydalandik.

push() va top() usullari haqida keyinroq qo‘llanmada bilib olamiz.

Stack usullari

C++ tilida stack klassi stekda turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.

Amaliyot tavsifi push() stekga element qo‘shadi pop() elementni stekdan olib tashlaydi top() stekning yuqori qismidagi elementni qaytaradi size() stekdagi elementlar sonini qaytaradi empty() , agar stek bo‘sh bo‘lsa, true ni qaytaradi

Stackga element qo'shing

Biz stekga element qo'shish uchun push() usulidan foydalanamiz. Masalan,

example.cpp
#include <iostream>
#include <stack>
using namespace std;

int main() {

  // satrlar to'plamini yarating
  stack<string> colors;

  // elementlarni stekga suring
  colors.push("Red");
  colors.push("Orange");
  
  cout << "Stack: ";

  // stek elementlarini chop etish
   while(!colors.empty()) {
    cout << colors.top() << ", ";
    colors.pop();
  }
 
  return 0;
}

Chiqish

kod
Stack: Orange, Red,

Yuqoridagi misolda biz ranglar deb nomlangan satrlar to'plamini yaratdik. Keyin, biz stekga elementlar qo'shish uchun push() usulidan foydalandik.

example.cpp
colors.push("Red");
colors.push("Orange");

To'g'ridan-to'g'ri stek tarkibini chop etish o'rniga biz while sikli va turli stek usullaridan foydalandik.

example.cpp
while(!colors.empty()) {
  cout << colors.top() << ", ";
  colors.pop();
}

Stackning barcha elementlarini chop etish uchun biz uning yuqori elementini chop qilamiz va keyin uni sikl ichida ochamiz (olib tashlaymiz). Ushbu jarayon stek bo'sh bo'lgunga qadar takrorlanadi.

Biz keyingi bo'limlarda pop() , top() va empty() usullari haqida bilib olamiz.

Shuningdek, biz elementlarni quyidagi tartibda kiritganimizga e'tibor bering: {"Red", "Orange"} .

Ammo elementlarni chop etishda biz {"Orange", "Red"} ni olamiz.

Buning sababi shundaki, stek LIFO ma'lumotlar strukturasi bo'lib, oxirgi kiritilgan element birinchi bo'lib olinadi.

[!NOTE] Vektorlar yoki boshqa konteynerlardan farqli o'laroq, biz stek orqali takrorlash uchun diapazonli for siklidan foydalana olmaymiz. Buning sababi, STL stegi STL Container Adapter bo'lib, u standart stek ma'lumotlar tuzilmasi kabi harakat qilish uchun cheklangan kirishni ta'minlaydi.

Stackdan elementlarni olib tashlang

pop() usuli yordamida stekdan elementni olib tashlashimiz mumkin. Masalan,

example.cpp
#include <iostream>
#include <stack>
using namespace std;

// display_stack yordam dasturi uchun funksiya prototipi
void display_stack(stack<string> st);

int main() {

  // satrlar to'plamini yarating
  stack<string> colors;

  // elementlarni stekga suring
  colors.push("Red");
  colors.push("Orange");
  colors.push("Blue");
  
  cout << "Initial Stack: ";
  // stek elementlarini chop etish
  display_stack(colors);
  
  // oxirgi kiritilganidek "Moviy"ni olib tashlaydi
  colors.pop();
  
  cout << "Final Stack: ";

  // stek elementlarini chop etish
  display_stack(colors);
  
  return 0;
}

// stek elementlarini ko'rsatish uchun yordamchi dastur
void display_stack(stack<string> st) {

  while(!st.empty()) {
    cout << st.top() << ", ";
    st.pop();
  }

  cout << endl;
}

Chiqish

kod
Initial Stack: Blue, Orange, Red, 
Final Stack: Orange, Red,

Yuqoridagi misolda biz stekdan elementni olib tashlash uchun pop() usulidan foydalandik.

Dastlab, stekning mazmuni {"Blue", "Orange", "Red"} dir.

Keyin elementni olib tashlash uchun pop() usulidan foydalandik.

example.cpp
// yuqori elementni olib tashlaydi
colors.pop()

Bu stack ning yuqori qismidagi elementni, ya'ni oxirgi kiritilgan elementni, ya'ni "Blue" ni olib tashlaydi.

Shunday qilib, yakuniy stek {"Orange", "Red"} ga aylanadi.

Stackdan elementlarga kirish

top() usuli yordamida stekning yuqori qismidagi elementga kiramiz. Masalan,

example.cpp
#include <iostream>
#include <stack>
using namespace std;

int main() {

  // satrlar to'plamini yarating
  stack<string> colors;

  // elementni stekga suring
  colors.push("Red");
  colors.push("Orange");
  colors.push("Blue");
  
  // yuqori elementni oling
  string top = colors.top();

  cout << "Top Element: " << top;
  
  return 0;
}

Chiqish

kod
Top Element: Blue

Yuqoridagi misolda biz ranglar deb nomlangan satrlar to'plamini yaratdik va quyidagi elementlarni qo'shdik: "Red" , "Orange" va "Blue" .

Keyin yuqori elementga kirish uchun top() usulidan foydalandik:

example.cpp
string top = colors.top();

Bu erda "Blue" oxirgi kiritilgan, shuning uchun u eng yuqori element hisoblanadi.

Stack hajmini oling

stack dagi elementlar sonini olish uchun size() usulidan foydalanamiz. Masalan,

example.cpp
#include <iostream>
#include <stack>
using namespace std;

int main() {

  // int stekini yarating
  stack<int> prime_nums;

  // elementlarni stekga suring
  prime_nums.push(2);
  prime_nums.push(3);
  prime_nums.push(5);
  
  // stack hajmini oling
  int size = prime_nums.size();
  cout << "Size of the stack: " << size;

  return 0;
}

Chiqish

kod
Size of the stack: 3

Yuqoridagi misolda biz prime_nums deb nomlangan butun sonlar to'plamini yaratdik va unga uchta element qo'shdik.

Keyin biz stekdagi elementlar sonini topish uchun size() usulidan foydalandik:

example.cpp
prime_nums.size();

Biz stekga 3 ta element qo'shganimiz sababli, prime_nums.size() 3 ni qaytaradi.

Stack bo'sh yoki yo'qligini tekshiring

Stack bo'sh yoki yo'qligini tekshirish uchun biz empty() usulidan foydalanamiz. Bu usul qaytaradi:

  • 1 (to'g'ri) - agar stek bo'sh bo'lsa
  • 0 (noto'g'ri) - agar stek bo'sh bo'lmasa

Masalan,

example.cpp
#include <iostream>
#include <stack>
using namespace std;

int main() {

  // juftlik to'plamini yarating
  stack<double> nums;
  
  cout << "Is the stack empty? ";

  // stek bo'sh yoki yo'qligini tekshiring
  if (nums.empty()) {
    cout << "Yes" << endl;
  }
  else {
    cout << "No" << endl;
  }

  cout << "Pushing elements..." << endl;

  // elementni stekga suring
  nums.push(2.3);
  nums.push(9.7);
 
  cout << "Is the stack empty? ";

  // stek bo'sh yoki yo'qligini tekshiring
  if (nums.empty()) {
    cout << "Yes";
  }
  else {
    cout << "No";
  }

  return 0;
}

Chiqish

kod
Is the stack empty? Yes
Pushing elements...
Is the stack empty? No

Yuqoridagi misolda biz stack bo'sh yoki yo'qligini aniqlash uchun empty() usulidan foydalanganmiz,

example.cpp
if(nums.empty()) { // noto'g'ri qaytaradi
  cout << "Yes" << end;;
}
else {
  cout << "No" << endl; 
}

Dastlab, stekda hech qanday element yo'q. Shunday qilib, nums.empty() true ni qaytaradi.

Keyin biz stekga elementlar qo'shdik.

Shunga qaramay, biz stek bo'sh yoki yo'qligini aniqlash uchun nums.empty() dan foydalanamiz. Bu safar false ni qaytaradi.