تكدس في C++ المحكمة الخاصة بلبنان مع مثال

⚡ ملخص ذكي

تكدس في C++ تُطبّق مكتبة STL مُهايئ حاوية LIFO الذي يُضيف ويُزيل العناصر من طرف واحد، ثم يُغلّفها.ping حاوية تسلسل أساسية مثل deque أو vector أو list لإدارة البيانات المرتبة.

  • 🔘 مبدأ LIFO: يتبع std::stack ترتيب Last In First Out، لذا فإن العنصر الذي تم دفعه مؤخرًا هو دائمًا أول عنصر تمت إزالته.
  • 📦 محول الحاوية: تقوم المكدسة بتغليف حاوية تسلسل موجودة، وتكون افتراضياً قائمة انتظار مزدوجة (deque) عندما لا يتم توفير نوع الحاوية.
  • ➕ العمليات الأساسية: تقوم وظائف الدفع والسحب والأعلى بإدخال عنصر وإزالة العنصر العلوي وقراءة العنصر العلوي على التوالي.
  • 🔍 عمليات التحقق الحكومية: تُبلغ وظائف empty و size عما إذا كانت المكدسة تحتوي على عناصر وعدد العناصر التي تخزنها حاليًا.
  • 🔁 وظائف اضافية: تقوم وظائف emplace و swap بإنشاء عنصر في مكانه وتبادل محتويات مكدسين.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم برامج مساعدة البرمجة بالذكاء الاصطناعي مثل GitHub Copilot بإنشاء نماذج أولية لعمليات دفع المكدس وسحبه واجتيازه من تعليق قصير.

تكدس في C++ المحكمة الخاصة بلبنان

ما هو الأمراض المنقولة جنسيا :: المكدس؟

المكدس عبارة عن بنية بيانات تعمل على أساس أسلوب LIFO (Last In First Out). يسمح std::stack بإضافة العناصر وإزالتها من طرف واحد فقط.

يُعدّ الصنف std::stack مُهايئًا للحاويات. تحتوي كائنات الحاويات على بيانات من نوع بيانات مُتشابه. يُمكنك إنشاء مكدس من حاويات تسلسلية مُختلفة. في حال عدم توفير حاوية، سيتم استخدام حاوية deque افتراضيًا. لا تدعم مُهايئات الحاويات المُكرِّرات، لذا لا يُمكن استخدامها لمعالجة البيانات.

بناء جملة المكدس

لإنشاء مكدس، يجب علينا تضمين ملف الرأس في الكود الخاص بنا. نستخدم بعد ذلك بناء الجملة هذا لتحديد std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • النوع - هو نوع العنصر الموجود في std::stack. يمكن أن يكون أي صالح C++ اكتب أو حتى نوع محدد من قبل المستخدم.
  • وعاء - هو نوع كائن الحاوية الأساسي.

أنواع الأعضاء

فيما يلي أنواع أعضاء المكدس:

  • نوع القيمة– المعلمة الأولى للقالب، T. تشير إلى أنواع العناصر.
  • نوع الحاوية– المعامل الثاني للقالب، وهو الحاوية. يشير إلى نوع الحاوية الأساسية.
  • نوع_الحجم– نوع عدد صحيح غير مُوقّع.

Operaفي المكدس

A C++ يدعم Stack العمليات الأساسية التالية:

  • دفع – يقوم بإضافة/دفع عنصر إلى المكدس.
  • فرقعة – يقوم بإزالة/إخراج عنصر من المجموعة.
  • نظرة مختلسة – يعيد العنصر العلوي من المكدس دون إزالته.
  • ممتلئ - يتحقق مما إذا كانت المجموعة ممتلئة.
  • فارغ - يتحقق مما إذا كانت المجموعة فارغة.

تنفيذ المكدس

توضح الخطوات التالية كيفية تحرك الجزء العلوي من المكدس عند إضافة العناصر ثم إزالتها:

الخطوة 1) لدينا في البداية مكدس فارغ. يتم تعيين أعلى المكدس الفارغ إلى -1.

الخطوة الثانية) بعد ذلك، قمنا بإضافة العنصر رقم 5 إلى المكدس. سيشير أعلى المكدس إلى العنصر رقم 5.

الخطوة 3) بعد ذلك، قمنا بدفع العنصر 50 إلى المكدس. يتحرك الجزء العلوي من المكدس ويشير إلى العنصر 50.

الخطوة الرابعة) بعد ذلك، قمنا بتنفيذ عملية إزالة عنصر من أعلى المكدس. تم إزالة العنصر 50 من المكدس. يشير أعلى المكدس الآن إلى العنصر 5.

تنفيذ المكدس

دفع () والبوب ​​()

تضيف الدالة stack::push() عنصرًا جديدًا إلى أعلى المكدس. ويزداد حجم المكدس بمقدار 1 بعد الإضافة. تأخذ الدالة الصيغة التالية:

stack.push(value)

القيمة هي العنصر المراد إدراجه في المكدس.

تقوم الدالة `stack::pop()` بإزالة العنصر العلوي من المكدس، وهو أحدث عنصر فيه. ويقل حجم المكدس بمقدار 1 بعد الإزالة. إليك صيغة الدالة:

stack.pop()

لا تأخذ الدالة أي معلمات.

مثال 1:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

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

الإخراج:

دفع () والبوب ​​()

فيما يلي لقطة شاشة للكود:

دفع () والبوب ​​()

Code التفسير:

  1. قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
  2. قم بتضمين ملف رأس المكدس في الكود الخاص بنا لاستخدام وظائفه.
  3. قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
  4. استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج ضمن هذه الوظيفة.
  5. قم بإنشاء مكدس لتخزين قيم الأعداد الصحيحة.
  6. استخدم الدالة Push() لإدراج القيمة 10 في المكدس.
  7. استخدم الدالة Push() لإدراج القيمة 20 في المكدس.
  8. استخدم الدالة Push() لإدراج القيمة 30 في المكدس.
  9. استخدم الدالة Push() لإدراج القيمة 40 في المكدس.
  10. استخدم الدالة pop() لإزالة العنصر العلوي من المكدس، أي 40. يصبح العنصر العلوي الآن 30.
  11. استخدم الدالة pop() لإزالة العنصر العلوي من المكدس، أي 30. يصبح العنصر العلوي الآن 20.
  12. استخدم حلقة while ووظيفة empty() للتحقق مما إذا كانت المكدس غير فارغ. ! هو عامل NOT.
  13. طباعة المحتويات الحالية للمكدس على وحدة التحكم.
  14. استدعاء الدالة pop() على المكدس.
  15. نهاية جسم الحلقة while.
  16. نهاية نص الوظيفة الرئيسية ().

فارغة ()، الحجم ()، أعلى ()

تحتوي الأكوام على وظائف مدمجة يمكنك استخدامها للتلاعب بالمكدس وقيمه. وتشمل هذه:

  • فارغ()- يتحقق مما إذا كانت المكدسة فارغة أم لا.
  • بحجم()– تُرجع حجم المكدس، أي عدد العناصر الموجودة في المكدس.
  • أعلى()- الوصول إلى عنصر المكدس في الأعلى.

مثال 2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

الإخراج:

فارغة ()، الحجم ()، أعلى ()

فيما يلي لقطة شاشة للكود:

فارغة ()، الحجم ()، أعلى ()

Code التفسير:

  1. قم بتضمين ملف رأس iostream في الكود الخاص بنا من أجل استخدام وظائفه.
  2. قم بتضمين ملف رأس المكدس في الكود الخاص بنا من أجل استخدام وظائفه.
  3. قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاتها دون استدعائها.
  4. قم بإنشاء الوظيفة createStack التي يمكننا استخدامها لإنشاء المكدس mystack. ستحتوي المكدس على مجموعة من الأعداد الصحيحة.
  5. بداية نص وظيفة createStack.
  6. قم بإنشاء مثيل لنوع البيانات mystack وإعطائه الاسم ms.
  7. استخدم حلقة while والدالة الفارغة () للتحقق مما إذا كانت المكدس فارغة.
  8. بداية جسم الحلقة while.
  9. استخدم الدالة top() المخزنة في الجزء العلوي من المكدس. سيقوم الحرف \t بإنشاء علامة تبويب جديدة.
  10. استخدم الدالة pop() لحذف العنصر الموجود أعلى المكدس.
  11. نهاية جسم الحلقة while.
  12. طباعة سطر فارغ على وحدة التحكم.
  13. نهاية نص الدالة createStack.
  14. استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص الدالة main().
  15. بداية نص الدالة الرئيسية ().
  16. إنشاء كائن مكدس ش.
  17. استخدم الدالة Push() لإدراج العنصر 32 في المكدس.
  18. استخدم الدالة Push() لإدراج العنصر 21 في المكدس.
  19. استخدم الدالة Push() لإدراج العنصر 39 في المكدس.
  20. استخدم الدالة Push() لإدراج العنصر 89 في المكدس.
  21. استخدم الدالة Push() لإدراج العنصر 25 في المكدس.
  22. طباعة بعض النص على وحدة التحكم.
  23. قم باستدعاء الدالة createStack لتنفيذ عمليات الإدراج المذكورة أعلاه في المكدس.
  24. اطبع حجم المكدس الموجود على وحدة التحكم بجانب النص الآخر.
  25. اطبع العنصر الموجود أعلى المكدس على وحدة التحكم.
  26. طباعة بعض النص على وحدة التحكم.
  27. احذف العنصر الموجود أعلى المكدس. ثم سيتم إرجاع العناصر المتبقية في المكدس.
  28. قم باستدعاء الدالة createStack لتنفيذ العمليات المذكورة أعلاه.
  29. يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
  30. نهاية نص الوظيفة الرئيسية ().

وضع () ومبادلة ()

هذه هي وظائف المكدس المضمنة الأخرى:

  • emplace()– يقوم بإنشاء عنصر جديد ثم إدراجه في أعلى المكدس.
  • تبديل()– يتبادل محتويات المكدس مع محتويات مكدس آخر.

مثال 3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

الإخراج:

وضع () ومبادلة ()

فيما يلي لقطة شاشة للكود:

وضع () ومبادلة ()

Code التفسير:

  1. قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
  2. قم بتضمين ملف رأس المكدس في الكود الخاص بنا لاستخدام وظائفه.
  3. قم بتضمين ملف رأس cstdlib في الكود الخاص بنا لاستخدام وظائفه.
  4. قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
  5. استدعاء الدالة الرئيسية (). سيتم إضافة منطق البرنامج داخل نص هذه الوظيفة.
  6. قم بتعريف مكدس يسمى st1 لتخزين قيم الأعداد الصحيحة.
  7. قم بتعريف مكدس يسمى st2 لتخزين قيم الأعداد الصحيحة.
  8. استخدم الدالة emplace() لإدراج العدد الصحيح 12 في المكدس المسمى st1.
  9. استخدم الدالة emplace() لإدراج العدد الصحيح 19 في المكدس المسمى st1.
  10. استخدم الدالة emplace() لإدراج العدد الصحيح 20 في المكدس المسمى st2.
  11. استخدم الدالة emplace() لإدراج العدد الصحيح 23 في المكدس المسمى st2.
  12. استخدم وظيفة المبادلة () لتبديل محتويات المكدسين، st1 وst2. يجب نقل محتويات المكدس st1 إلى المكدس st2. يجب نقل محتويات المكدس st2 إلى المكدس st1.
  13. طباعة بعض النص على وحدة التحكم.
  14. استخدم عبارة while والدالة الفارغة () للتحقق مما إذا كان المكدس st1 ليس فارغًا.
  15. اطبع محتويات المكدس st1 على وحدة التحكم. يضيف " " مسافة بين عناصر المكدس عند طباعتها على وحدة التحكم.
  16. قم بتنفيذ وظيفة pop() على المكدس st1 لإزالة العنصر العلوي.
  17. نهاية نص بيان while.
  18. طباعة بعض النص على وحدة التحكم. النهاية هي أ C++ الكلمة الأساسية لخط النهاية. يقوم بتحريك مؤشر الماوس إلى السطر التالي لبدء الطباعة من هناك.
  19. استخدم عبارة while والدالة الفارغة () للتحقق مما إذا كان المكدس st2 ليس فارغًا.
  20. اطبع محتويات المكدس st2 على وحدة التحكم. يضيف " " مسافة بين عناصر المكدس عند طباعتها على وحدة التحكم.
  21. قم بتنفيذ وظيفة pop() على المكدس st2 لإزالة العنصر العلوي.
  22. نهاية نص بيان while.
  23. نهاية نص الدالة main().

كومة في المحكمة الخاصة بلبنان

تأتي STL (مكتبة النماذج القياسية) مع فئات القوالب التي توفر ملفات مشتركة C++ هياكل البيانات. لذلك، يمكن أيضًا تنفيذ المكدس في STL. نحن ببساطة نقوم بتضمين هذه المكتبة في الكود الخاص بنا ونستخدمها لتحديد المكدس.

stack<T> st; 

يعلن بناء الجملة أعلاه عن مكدس st لعناصر من نوع البيانات T.

مثال 4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

الإخراج:

كومة في المحكمة الخاصة بلبنان

فيما يلي لقطة شاشة للكود:

كومة في المحكمة الخاصة بلبنان

Code التفسير:

  1. قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
  2. قم بتضمين ملف رأس المكدس في الكود الخاص بنا لاستخدام وظائفه.
  3. قم بتضمين ملف رأس cstdlib في الكود الخاص بنا لاستخدام وظائفه.
  4. قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
  5. استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
  6. قم بتعريف St Stack لتخزين البيانات الصحيحة.
  7. أضف العنصر 12 إلى المكدس.
  8. أضف العنصر 19 إلى المكدس.
  9. أضف العنصر 20 إلى المكدس.
  10. اطبع العنصر الموجود أعلى المكدس على وحدة التحكم.
  11. اطبع حجم المكدس على وحدة التحكم.
  12. نهاية نص الدالة الرئيسية ().

الأسئلة الشائعة

تتبع المكدسة ترتيب "آخر ما يدخل أول ما يخرج"، لذا فهي تزيل أحدث عنصر أولاً. أما الطابور فيتبع ترتيب "أول ما يدخل أول ما يخرج"، حيث تزيل أقدم عنصر أولاً. كل منهما يلبي احتياجات معالجة مختلفة.

نعم. يقبل std::stack أي حاوية تسلسلية كوسيط قالب ثانٍ، مثل std::stack >. يناسب نظام deque الافتراضي معظم الحالات، بينما يمكن أن يحسن المتجه من موضع الذاكرة عندما ينمو المكدس بشكل متوقع.

تُنفذ عمليتا الإضافة والحذف في زمن ثابت O(1) لأن المكدس لا يتعامل إلا مع العنصر العلوي. وتضيف قائمة الانتظار المزدوجة العناصر دون إزاحة العناصر الموجودة، لذا يظل الأداء قابلاً للتنبؤ بغض النظر عن حجم المكدس.

لا يُتيح std::stack أي مُكرِّرات، لذا لن يتم تجميع حلقة التكرار القائمة على النطاق. لقراءة كل قيمة، انسخ المكدس واستدعِ top() و pop() بشكل متكرر على النسخة، أو اختر قائمة انتظار مزدوجة (deque) عند الحاجة إلى اجتيازها.

تُرجع الدالة pop() قيمة فارغة (void) عمدًا، وذلك لفصل عملية الحذف عن عملية الوصول إليها لضمان سلامة البيانات في حال حدوث استثناء. قد يؤدي الجمع بين القراءة والحذف في خطوة واحدة إلى فقدان البيانات إذا حدث خطأ أثناء النسخ، لذا يُنصح باستدعاء الدالة top() أولًا ثم الدالة pop().

لا. لا يوفر std::stack أي تزامن مدمج، لذا فإن استدعاءات الدفع والسحب المتزامنة من عدة سلاسل عمليات تتسبب في حدوث تضارب في البيانات. احمِ الوصول المشترك باستخدام mutex أو آلية تأمين أخرى قبل استخدام مكدس واحد عبر سلاسل العمليات.

نعم. تقوم برامج المساعدة البرمجية التي تعمل بالذكاء الاصطناعي بقراءة تعليق أو اسم دالة وإنتاج تعريفات std::stack وحلقات الدفع والسحب ومنطق الاجتياز. Revتظل مراجعة عمليات التحقق من الحدود التي تم إنشاؤها، مثل اختبارات empty() قبل pop()، مهمة للبرامج الآمنة.

نعم. مساعد الطيار جيثب يُكمل استدعاءات push و pop و top و empty() أثناء الكتابة، ويقترح خيارات الحاويات. عام 2026 C++ تضيف خاصية ذكاء الكود الوعي بالرموز، بحيث تظل اقتراحات مكدس الملفات المتعددة متسقة.

تلخيص هذه التدوينة بـ: