الفرق بين المكدسات (Stacks) والطوابير (Queues) والقوائم المرتبطة (Linked Lists)
المقدمة
في هذا المقال، سنتعرف على الفروقات الرئيسية بين هياكل البيانات الشهيرة: المكدسات (Stacks)، الطوابير (Queues)، والقوائم المرتبطة (Linked Lists). فهم هذه الهياكل مهم جدًا للمبرمجين لأنها تُستخدم بشكل واسع في البرمجة لتخزين البيانات وإدارتها بطريقة فعالة.
ما هي المكدسات (Stacks)؟
المكدس (Stack) هو هيكل بيانات يُستخدم لتخزين البيانات بطريقة LIFO (Last In, First Out)، بمعنى أن العنصر الذي يتم إضافته أخيرًا إلى المكدس هو الذي يتم إزالته أولاً. يشبه المكدس كومة من الكتب، حيث يمكنك فقط إضافة أو إزالة الكتب من أعلى الكومة.
العمليات الأساسية في المكدس هي:
- push: لإضافة عنصر إلى أعلى المكدس.
- pop: لإزالة العنصر العلوي من المكدس.
- peek: لعرض العنصر العلوي دون إزالته.
مثال:
// إنشاء مكدس بسيط
class Stack {
constructor() {
this.items = [];
}
// إضافة عنصر إلى المكدس
push(element) {
this.items.push(element);
}
// إزالة العنصر العلوي
pop() {
if (this.items.length == 0) return "Underflow";
return this.items.pop();
}
// عرض العنصر العلوي
peek() {
return this.items[this.items.length - 1];
}
}
let stack = new Stack();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // ناتج: 20
ما هي الطوابير (Queues)؟
الطابور (Queue) هو هيكل بيانات يُستخدم لتخزين البيانات بطريقة FIFO (First In, First Out)، بمعنى أن العنصر الذي يُضاف أولاً هو الذي يُزال أولاً. يشبه الطابور طابور الانتظار في محل، حيث يخدم الشخص الذي يصل أولاً أولاً.
العمليات الأساسية في الطابور هي:
- enqueue: لإضافة عنصر إلى نهاية الطابور.
- dequeue: لإزالة العنصر الأول من الطابور.
- front: لعرض العنصر الأول دون إزالته.
مثال:
// إنشاء طابور بسيط
class Queue {
constructor() {
this.items = [];
}
// إضافة عنصر إلى الطابور
enqueue(element) {
this.items.push(element);
}
// إزالة العنصر الأول
dequeue() {
if (this.items.length == 0) return "Underflow";
return this.items.shift();
}
// عرض العنصر الأول
front() {
return this.items[0];
}
}
let queue = new Queue();
queue.enqueue(10);
queue.enqueue(20);
console.log(queue.dequeue()); // ناتج: 10
ما هي القوائم المرتبطة (Linked Lists)؟
القائمة المرتبطة (Linked List) هي هيكل بيانات يتكون من مجموعة من العناصر (Nodes) حيث يحتوي كل عنصر على البيانات الخاصة به بالإضافة إلى مؤشر (Pointer) يشير إلى العنصر التالي في القائمة. على عكس المكدسات والطوابير التي تعتمد على مؤشرات ثابتة، القائمة المرتبطة تتيح لك المرونة في إضافة وحذف العناصر في أي مكان في القائمة.
هناك أنواع مختلفة من القوائم المرتبطة:
- قائمة مرتبطة فردية (Singly Linked List): كل عنصر يشير فقط إلى العنصر التالي.
- قائمة مرتبطة مزدوجة (Doubly Linked List): كل عنصر يحتوي على مؤشر يشير إلى العنصر السابق والعنصر التالي.
- قائمة مرتبطة دائرية (Circular Linked List): العنصر الأخير يشير إلى العنصر الأول لتكوين حلقة.
مثال:
// إنشاء قائمة مرتبطة فردية بسيطة
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
}
// إضافة عنصر إلى نهاية القائمة
append(value) {
let newNode = new Node(value);
if (this.head === null) {
this.head = newNode;
} else {
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
}
// عرض العناصر
printList() {
let current = this.head;
while (current) {
console.log(current.value);
current = current.next;
}
}
}
let linkedList = new LinkedList();
linkedList.append(10);
linkedList.append(20);
linkedList.printList(); // ناتج: 10, 20
الفرق الرئيسي بين المكدسات، الطوابير، والقوائم المرتبطة
الفروقات الرئيسية بين هذه الهياكل الثلاثة تكمن في طريقة تخزين وإدارة البيانات:
- المكدسات (Stacks): تُستخدم طريقة LIFO، حيث يُزال العنصر الذي تم إضافته أخيرًا أولاً.
- الطوابير (Queues): تُستخدم طريقة FIFO، حيث يُزال العنصر الذي تم إضافته أولاً أولاً.
- القوائم المرتبطة (Linked Lists): توفر مرونة في إضافة وحذف العناصر في أي مكان في القائمة، ولا تعتمد على ترتيب معين مثل المكدسات أو الطوابير.
متى نستخدم كل هيكل؟
يعتمد اختيار الهيكل المناسب على نوع التطبيق الذي تطوره:
- المكدسات (Stacks): تُستخدم عادةً في التطبيقات التي تحتاج إلى تتبع تاريخ العمليات مثل تنفيذ التراجع (Undo) أو التعامل مع تعبيرات رياضية.
- الطوابير (Queues): تُستخدم في أنظمة الجدولة أو إدارة العمليات، مثل قائمة انتظار الطابور في الطابعات أو عمليات الشبكات.
- القوائم المرتبطة (Linked Lists): تُستخدم عندما تحتاج إلى هيكل بيانات ديناميكي يسمح لك بإضافة أو إزالة العناصر بسهولة في أي مكان في القائمة، مثل قوائم المهام أو تطبيقات إدارة الذاكرة.
الخلاصة
تُعتبر هياكل البيانات مثل المكدسات، الطوابير، والقوائم المرتبطة أدوات أساسية في البرمجة، ولكل منها استخداماته الخاصة بناءً على نوع البيانات وطريقة إدارتها. فهم الفرق بينها سيساعدك على اتخاذ القرار الصحيح حول الهيكل المناسب لتطبيقاتك البرمجية.
اترك تعليقاً