تعريف الكلاس stack
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل فوق بعضها البعض مما يجعلك قادر فقط على التعامل مع العنصر الموجود في أعلاها.
طريقة تخزين العناصر في هذه الحاوية تعتمد أسلوب LIFO الذي هو اختصار لجملة Last In First out و التي تعني أن العنصر الأخير الذي يتم إضافته في الحاوية هو أول عنصر يمكن إخراجه منها كالتالي.

لاستخدام الكلاس stack
- أي حتى تتمكن من إنشاء كائنات منه - يجب تضمين الملف #include<stack>
لأنه موجود فيه.
بناء الكلاس
template < class T, class Alloc = allocator<T> >
class stack;
إذاً عند إنشاء كائن من الكلاس stack
يجب أن نمرر له نوع البيانات الذي نريد تخزينه فيه مكان الباراميتر T
.
أمثلة شاملة حول التعامل مع الكلاس stack
في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.
في المثال التالي قمنا بتعريف كائن من stack
مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int
.
بعدها قمنا بإضافة بعض العناصر فيه و من ثم طباعة عدد العناصر التي قمنا بإضافتها.
بعدها قمنا بعرض جميع القيم الموجودة فيه من خلال حلقة تستمر في التنفيذ طالما أن الكائن غير فارغ; في كل دورة في الحلقة كنا نقوم بعرض قيمة العنصر الموجود في الأعلى و من ثم نحذفه حتى نتمكن من الوصول للعنصر الموجود بعده مباشرةً.
ملاحظة: قمنا باستخدام الدالة push()
لإضافة العناصر, الدالة size()
لمعرفة عدد العناصر التي تم إضافتها, الدالة top()
للحصول على قيمة العنصر الموجود في أعلى الكائن في كل مرة, الدالة pop()
لحذف العنصر الموجود في أعلى الكائن و الدالة empty()
لمعرفة ما إن كان الكائن يحتوي على عناصر بعد أم لا.
المثال الأول
main.cpp
#include <iostream>
#include <stack>
using namespace std;
int main()
{
// int يمكنه أن يحتوي على قيم نوعها stack هنا قمنا بتعريف كائن من الكلاس
stack<int> myStack;
// push() باستخدام الدالة myStack هنا قمنا بإضافة 5 عناصر في الكائن
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
// size() باستخدام الدالة myStack هنا قمنا بطباعة عدد عناصر الكائن
cout << "Stack size = " << myStack.size() << endl;
cout << "Popping out stack elements:";
// لا يزال يحتوي على عناصر myStack هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
// بعدها سيتم حذفه مباشرةً ,myStack في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
while (!myStack.empty())
{
cout << " " << myStack.top();
myStack.pop();
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
Stack size = 5
Popping out stack elements: 5 4 3 2 1
في المثال التالي قمنا بتعريف كائنين من stack
مع تحديد أنه يمكن أن يحتويان على عناصر نوعها int
.
بعدها قمنا بتبديل عناصرهما و من ثم طباعة القيم التي أصبحت موجودة في كلٍّ منهما.
ملاحظة: قمنا باستخدام الدالة swap()
لتبديل قيمهما.
المثال الثاني
main.cpp
#include <iostream>
#include <stack>
using namespace std;
int main()
{
// int يمكنهما أن يحتويان على قيم نوعها stack هنا قمنا بتعريف كائنين من الكلاس
stack<int> stack1;
stack<int> stack2;
// push() باستخدام الدالة stack1 هنا قمنا بإضافة 4 عناصر في الكائن
stack1.push(1);
stack1.push(2);
stack1.push(3);
stack1.push(4);
// push() باستخدام الدالة stack2 هنا قمنا بإضافة 4 عناصر في الكائن
stack2.push(5);
stack2.push(6);
stack2.push(7);
stack2.push(8);
// stack2 مع قيم الكائن stack1 هنا قمنا بتبديل قيم الكائن
stack1.swap(stack2);
cout << "Popping out stack1 elements:";
// لا يزال يحتوي على عناصر stack1 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
// بعدها سيتم حذفه مباشرةً ,stack1 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
while (!stack1.empty())
{
cout << " " << stack1.top();
stack1.pop();
}
cout << "\nPopping out stack2 elements:";
// لا يزال يحتوي على عناصر stack2 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
// بعدها سيتم حذفه مباشرةً ,stack2 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في أعلى الكائن
while (!stack2.empty())
{
cout << " " << stack2.top();
stack2.pop();
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
Popping out stack1 elements: 8 7 6 5
Popping out stack2 elements: 4 3 2 1