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

To learn more about stacks, visit our tutorial on Stack Data Structure.
C++ da stek yaratish uchun avval stack sarlavha faylini kiritishimiz kerak.
#include <stack>
Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida stack yaratishimiz mumkin:
stack<type> st;
Bu erda type biz stekda saqlamoqchi bo'lgan ma'lumotlar turini ko'rsatadi. Masalan; misol uchun,
// butun sonlar to'plamini yarating
stack<int> integer_stack;
// satrlar to'plamini yarating
stack<string> string_stack;
#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
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.
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
Biz stekga element qo'shish uchun push() usulidan foydalanamiz. Masalan,
#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
Stack: Orange, Red,
Yuqoridagi misolda biz ranglar deb nomlangan satrlar to'plamini yaratdik. Keyin, biz stekga elementlar qo'shish uchun push() usulidan foydalandik.
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.
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
forsiklidan 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.
pop() usuli yordamida stekdan elementni olib tashlashimiz mumkin. Masalan,
#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
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.
// 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.
top() usuli yordamida stekning yuqori qismidagi elementga kiramiz. Masalan,
#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
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:
string top = colors.top();
Bu erda "Blue" oxirgi kiritilgan, shuning uchun u eng yuqori element hisoblanadi.
stack dagi elementlar sonini olish uchun size() usulidan foydalanamiz. Masalan,
#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
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:
prime_nums.size();
Biz stekga 3 ta element qo'shganimiz sababli, prime_nums.size() 3 ni qaytaradi.
Stack bo'sh yoki yo'qligini tekshirish uchun biz empty() usulidan foydalanamiz. Bu usul qaytaradi:
Masalan,
#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
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,
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.