الـStack بإستخدام القوائم المتصلة (ربط الـStack) 1
المقدمة
لقد قمنا بتغطية الـstack والـstack الذي تم تنفيذه باستخدام المصفوفات. الآن، دعونا نستكشف تنفيذ الـstack باستخدام المؤشرات ونناقش سبب اعتباره نهجًا متميزًا.
قد تتساءل عن سبب حاجتنا إلى مناقشة هذا البديل عندما نظرنا بالفعل إلى تطبيقات الـstack باستخدام المصفوفات. ألا يمكننا إستخدام بالمصفوفات وحسب؟
السبب وراء استكشاف تنفيذ الـstack باستخدام المؤشرات هو معالجة القيود المحتملة التي قد نواجهها مع التطبيقات المستندة إلى المصفوفة، خاصة فيما يتعلق بقيود الحجم. ومن خلال استخدام المؤشرات، يمكننا التحايل بشكل فعال على مثل هذه المشكلات، مما يضمن حلاً أكثر مرونة وقوة لإدارة البيانات داخل بنية الـstack.
يتضمن استخدام المؤشرات لتنفيذ الـstack تخصيص الذاكرة ديناميكيًا لعناصر الـstack ومعالجة المؤشرات لإدارة بنيته. يعد هذا الأسلوب مفيدًا بشكل خاص عندما لا يكون حجم الـstack معروفًا مسبقًا أو عندما تكون كفاءة الذاكرة موضع اهتمام.
بناء العقدة Node
تشير "العقدة node" إلى وحدة البناء الأساسية المستخدمة في العديد من هياكل البيانات، بما في ذلك القوائم المرتبطة والأشجار والرسوم البيانية والمزيد. العقدة node هي بنية تحتوي على مكونين رئيسيين:
- البيانات Data: يحمل هذا المكون القيمة الفعلية أو العنصر الذي تمثله العقدة. يمكن أن يكون من أي نوع بيانات اعتمادًا على التطبيق.
- Next Pointer المؤشر التالي (أو الرابط Link): هذا المكون هو مرجع أو مؤشر للعقدة التالية في التسلسل. يقوم بإنشاء الاتصال بين العقد في بنية البيانات.
تحدد مقتطفات التعليمات البرمجية هذه بنية العقدة الأساسية بلغات برمجة مختلفة:
- C++:
struct Node { Type item; Node* next; };
في C++، يتم استخدام struct لتعريف بنية تسمى Node. وفيه عضوان:
– item: متغير من النوع Type لتخزين البيانات.
- next: مؤشر إلى عقدة أخرى، يشير إلى العقدة التالية في التسلسل. - Java:
class Node { Type item; Node next; }
في Java، يتم استخدام class لتعريف فئة تسمى Node. وكذلك فهو يضم عضوين:
– item: متغير من النوع Type لتخزين البيانات.
- next: وهو object من نوع Node، يمثل العقدة التالية في التسلسل. - C#:
class Node { Type item; Node next; }
وهذا مشابه لجافا. في لغة C#، يتم استخدام class لتعريف فئة تسمى Node، وهي تحتوي أيضًا على عضوين:
– item: متغير من النوع Type لتخزين البيانات.
- next: وهو object من نوع Node، يمثل العقدة التالية في التسلسل. - Python:
class Node: def __init__(self): self.item = None self.next = None
في بايثون، يتم تعريف class يسمى Node. الأسلوب __init__ هو constructor يستخدم لتهيئة كائنات الـclass. داخل الـconstructor :
- تتم تهيئة self.item إلى None، مما يشير إلى أنه يقوم بتخزين البيانات.
- تتم تهيئة self.next إلى None، مما يشير إلى أنه يشير إلى العقدة التالية في التسلسل.
stackTop
يشير StackTop عادةً إلى العنصر العلوي في بنية بيانات الـstack. في سياق الـstack، هو متغير أو مؤشر يشير إلى العنصر العلوي للـstack، أو بمعنى آخر، العنصر المضاف حديثًا.
لتعيين قيمة stackTop للعضو التالي في الـnode:
- C++:
newNode هو مؤشر للعقدة، ومن المفترض أن يكون stackTop مؤشرًا آخر للعقدة. يقوم هذا السطر بتعيين قيمة stackTop للمؤشر التالي للعقدة الجديدة، مما يؤدي بشكل فعال إلى ربط العقدة الجديدة بالعقدة المشار إليها بواسطة stackTop.newNode->next = stackTop;
- Java, C#, Python:
newNode هو object من النوع Node، وstackTop هو أيضًا object من النوع Node. يقوم هذا السطر بتعيين مرجع الكائن المشار إليه بواسطة StackTop إلى الحقل التالي للعقدة الجديدة.newNode.next = stackTop; // Java and C# newNode.next = stackTop // Python
لتعيين قيمة newNode إلى StackTop:
C++, Java, C#, Python:
stackTop = newNode
StackTop هو مؤشر للعنصر العلوي للـstack الذي يتم تنفيذه باستخدام المؤشرات أو تخصيص الذاكرة الديناميكية. StackTop = newNode سيقوم بتحديث StackTop للإشارة إلى العقدة المنشأة حديثًا newNode. وهذا يجعل newNode العنصر العلوي الجديد في الـstack بشكل فعال.
لإنشاء نسخة من StackTop نستخدم الجملة:
temp = stackTop
لماذا نفعل هذا؟
يتيح لك إنشاء نسخة من stackTop (temp) التعامل بأمان مع العنصر العلوي من المكدس والوصول إليه دون التأثير على المؤشر أو المرجع أو القيمة الأصلية. فهو يوفر المرونة ويضمن بقاء البيانات الأصلية سليمة لاستخدامها في المستقبل.
الدوال الرئيسية لتطبيقات ADT stack (ربط الـStack) المرتكزة على المؤشر:
- push(Type newItem)
- pop()
- pop(Type& stackTop)
- getTop()
- display()
- isEmpty()