كيفية بناء هياكل البيانات باستخدام فئات JavaScript ES6

كيفية بناء هياكل البيانات باستخدام فئات JavaScript ES6

تعد هياكل البيانات جانبًا أساسيًا من علوم الكمبيوتر والبرمجة ، بغض النظر عن اللغة التي تستخدمها. يمكن أن تساعدك المعرفة الدقيقة بها في تنظيم البيانات وإدارتها وتخزينها وتعديلها بكفاءة. يمكن أن يؤدي تحديد بنية البيانات المناسبة لحالة الاستخدام إلى تحسين الأداء بهامش ضخم.





ومع ذلك ، فإن JavaScript يأتي فقط مع هياكل البيانات البدائية مثل المصفوفات والكائنات افتراضيًا. ولكن مع تقديم فئات ECMAScript 6 (ES6) ، يمكنك الآن إنشاء هياكل بيانات مخصصة مثل الحزم وقوائم الانتظار بمساعدة هياكل البيانات البدائية.





من android إلى xbox one

بنية البيانات المكدسة

تسمح لك بنية بيانات المكدس بدفع البيانات الجديدة إلى أعلى البيانات الحالية بطريقة LIFO (الوارد أخيرًا وصادر أولاً). من السهل تصور بنية البيانات الخطية باستخدام مثال بسيط. ضع في اعتبارك كومة من الأطباق المحفوظة على طاولة. يمكنك إضافة أو إزالة لوحة من أعلى المكدس فقط.





إليك كيفية تنفيذ بنية بيانات المكدس باستخدام مصفوفات JavaScript و فصول ES6 :

class Stack {
constructor() {
this.data = [];
this.top = -1;
}
}

دعنا نستكشف ونبني بعض العمليات التي يمكنك إجراؤها على مكدس.



دفع العملية

تُستخدم عملية الدفع لإدخال بيانات جديدة في المكدس. تحتاج إلى تمرير البيانات كمعامل أثناء استدعاء طريقة الدفع. قبل إدخال البيانات ، تتم زيادة المؤشر العلوي للمكدس بواحد ، ويتم إدخال البيانات الجديدة في الموضع العلوي.

push(data) {
this.top++;
this.data[this.top] = data;
return this.data;
}

عملية البوب

تُستخدم عملية الانبثاق لإزالة عنصر البيانات العلوي للمكدس. أثناء إجراء هذه العملية ، يتم تقليل المؤشر العلوي بمقدار 1.





pop() {
if (this.top <0) return undefined;
const poppedTop = this.data[this.top];
this.top--;
return poppedTop;
}

عملية النظرة الخاطفة

تُستخدم عملية النظرة الخاطفة لإرجاع القيمة الموجودة أعلى المكدس. التعقيد الزمني لاسترداد هذه البيانات هو O (1).

يتعلم أكثر: ما هو تدوين Big-O؟





peek() {
return this.top >= 0 ? this.data[this.top] : undefined;
}

بنية بيانات القائمة المرتبطة

القائمة المرتبطة هي بنية بيانات خطية تتكون من عدة عقد متصلة ببعضها البعض بمساعدة المؤشرات. تحتوي كل عقدة في القائمة على البيانات ومتغير المؤشر الذي يشير إلى العقدة التالية في القائمة.

تعرف على المزيد: مقدمة إلى المؤشرات للمبرمجين

على عكس المكدس ، تتطلب عمليات تنفيذ القائمة المرتبطة في JavaScript فئتين. الدرجة الأولى هي العقدة فئة لإنشاء عقدة ، والفئة الثانية هي لينكدليست فئة لأداء جميع العمليات في القائمة المرتبطة. يشير مؤشر الرأس إلى العقدة الأولى من القائمة المرتبطة ، ويشير مؤشر الذيل إلى العقدة الأخيرة من القائمة المرتبطة.

class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
}
}

فيما يلي بعض العمليات الأساسية التي يمكنك إجراؤها في قائمة مرتبطة:

إلحاق العملية

تُستخدم عملية الإلحاق لإضافة عقدة جديدة إلى نهاية القائمة المرتبطة. يجب عليك تمرير البيانات كمعامل لإدراج عقدة جديدة. أولاً ، قم بإنشاء كائن عقدة جديد باستخدام الجديد الكلمات الرئيسية في جافا سكريبت.

إذا كانت القائمة المرتبطة فارغة ، فسيشير كل من مؤشر الرأس والذيل إلى العقدة الجديدة. خلاف ذلك ، سيشير مؤشر الذيل فقط إلى العقدة الجديدة.

append(data) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size++;
return this;
}

أدخل العملية

لإدراج عقدة جديدة في فهرس معين ، يمكنك الاستفادة من عملية الإدراج. تأخذ هذه الطريقة معلمتين: البيانات المراد إدراجها والفهرس الذي سيتم إدراجها فيه. في أسوأ الحالات ، تحتوي هذه الطريقة على تعقيد زمني لـ O (N) حيث قد تضطر إلى اجتياز القائمة بأكملها.

insert(data, index) {
if (index this.size) return undefined;
if (index === 0) {
this.head = new Node(data, this.head);
!this.tail ? (this.tail = this.head) : null;
this.size++;
return this;
}
if (index === this.size) return this.append(data);
let count = 0;
let beforeNode = this.head;
while (count !== index) {
beforeNode = beforeNode.next;
count++;
}
const newNode = new Node(data);
let afterNode = beforeNode.next;
newNode.next = afterNode;
beforeNode.next = newNode;
this.size++;
return this;
}

حذف العملية

تمر عملية الحذف عبر القائمة المرتبطة للحصول على المرجع للعقدة المراد حذفها وإزالة ارتباط العقدة السابقة. على غرار عملية الإدراج ، فإن عملية الحذف لها أيضًا تعقيد زمني لـ O (N) في أسوأ الحالات.

deleteNode(index) {
if (index === 0) {
const removedHead = this.head;
this.head = this.head.next;
this.size--;
this.size === 0 ? (this.tail = null) : null;
return removedHead;
}
if (index === this.size - 1) {
if (!this.head) return undefined;
let currentNode = this.head;
let newTail = currentNode;
while (currentNode.next) {
newTail = currentNode;
currentNode = currentNode.next;
}
this.tail = newTail;
this.tail.next = null;
this.size--;
this.size === 0 ? ([this.head, this.tail] = [null, null]) : null;
return currentNode;
}
if (index this.size - 1) return undefined;
let count = 0;
let beforeNode = this.head;
while (count !== index - 1) {
beforeNode = beforeNode.next;
count++;
}
const removedNode = beforeNode.next;
let afterNode = removedNode.next;
beforeNode.next = afterNode;
removedNode.next = null;
this.size--;
return removedNode;
}

هيكل بيانات قائمة الانتظار

تشبه بنية بيانات قائمة الانتظار مجموعة من الأشخاص الذين يقفون في قائمة انتظار. يتم تقديم الشخص الذي يدخل قائمة الانتظار أولاً قبل الآخرين. وبالمثل ، تتبع بنية البيانات الخطية طريقة FIFO (الوارد أولاً ، أولاً) لإدراج البيانات وإزالتها. يمكن إعادة إنشاء بنية البيانات هذه في JavaScript باستخدام قائمة مرتبطة بهذه الطريقة:

class Queue {
constructor() {
this.front = null;
this.rear = null;
this.size = 0;
}
}

إليك كيفية إدراج البيانات وإزالتها من قائمة انتظار في JavaScript:

لماذا لا يعمل Netflix على هاتفي

عملية قائمة الانتظار

تقوم عملية قائمة الانتظار بإدراج بيانات جديدة في قائمة الانتظار. أثناء استدعاء هذه الطريقة ، إذا كانت بنية بيانات قائمة الانتظار فارغة ، فإن كلا من المؤشرات الأمامية والخلفية تشير إلى العقدة المدرجة حديثًا في قائمة الانتظار. إذا لم تكن قائمة الانتظار فارغة ، تتم إضافة العقدة الجديدة إلى نهاية القائمة ويشير المؤشر الخلفي إلى هذه العقدة.

enqueue(data) {
const newNode = new Node(data);
if (!this.front) {
this.front = newNode;
this.rear = newNode;
} else {
this.rear.next = newNode;
this.rear = newNode;
}
this.size++;
return this;
}

عملية Dequeue

تزيل عملية dequeue العنصر الأول في قائمة الانتظار. أثناء عملية dequeue ، يتحرك مؤشر الرأس للأمام إلى العقدة الثانية في القائمة. أصبحت هذه العقدة الثانية الآن رأس قائمة الانتظار.

dequeue() {
if (!this.front) return undefined;
if (this.front === this.rear) this.rear = null;
const dequeuedNode = this.front;
this.front = this.front.next;
this.size--;
return dequeuedNode;
}

الخطوة التالية بعد هياكل البيانات

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

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

يشارك يشارك سقسقة بريد الالكتروني مقدمة في خوارزمية فرز الفقاعات

خوارزمية فرز الفقاعات: مقدمة ممتازة لفرز المصفوفات.

اقرأ التالي
مواضيع ذات صلة
  • برمجة
  • جافا سكريبت
  • برمجة
  • دروس الترميز
نبذة عن الكاتب نيتين رانجاناث(31 مقالة منشورة)

نيتين هو مطور برمجيات متحمس وطالب هندسة كمبيوتر يطور تطبيقات الويب باستخدام تقنيات جافا سكريبت. يعمل كمطور ويب مستقل ويحب الكتابة لنظام Linux والبرمجة في أوقات فراغه.

المزيد من Nitin Ranganath

اشترك في نشرتنا الإخبارية

انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!

انقر هنا للاشتراك