الخوارزميات وهياكل البيانات بلغة TypeScript: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا تعتبر الخوارزميات وهياكل البيانات مهمة في TypeScript؟



في تطوير الويب الحديث، تحتل TypeScript مكانة رائدة، حيث تقدم كتابة صارمة (strict typing) وأدوات قوية لبناء تطبيقات قابلة للتوسع. ومع ذلك، حتى الكود الأكثر أناقة لن يكون فعالاً دون فهم أساسيات الخوارزميات وهياكل البيانات. هذه المقالة هي دليلك إلى عالم الكود المحسّن في TypeScript. سنقوم بتحليل هياكل البيانات الرئيسية، ونوضح كيفية تنفيذها مع مراعاة الأنواع (types)، وننظر في الخوارزميات الكلاسيكية. بعد القراءة، ستتمكن من كتابة كود ليس فقط فعالاً، بل سريعاً ويمكن التنبؤ به.



1. هياكل البيانات الأساسية مع الكتابة (Typing)



تسمح TypeScript بتحديد أنواع البيانات التي يمكن تخزينها في الهيكل بشكل صارم. هذا يمنع الأخطاء في مرحلة التجميع (compilation). دعنا ننظر في ثلاثة هياكل أساسية.



1.1. المكدس (Stack) — مبدأ LIFO

يعمل المكدس على مبدأ "آخر من يدخل هو أول من يخرج" (Last In, First Out). مثالي للمهام التي تتطلب التراجع عن الإجراءات (مثل سجل التصفح في المتصفح).

// تنفيذ المكدس مع النوع العام Tclass Stack<T> {    private items: T[] = [];

push(item: T): void { this.items.push(item); }

pop(): T | undefined { return this.items.pop(); }

peek(): T | undefined { return this.items[this.items.length - 1]; }

isEmpty(): boolean { return this.items.length === 0; }}

// مثال على الاستخدامconst numberStack = new Stack<number>();numberStack.push(10);numberStack.push(20);console.log(numberStack.pop()); // 20


1.2. قائمة الانتظار (Queue) — مبدأ FIFO

تعمل قائمة الانتظار على مبدأ "أول من يدخل هو أول من يخرج" (First In, First Out). تُستخدم لمعالجة المهام حسب ترتيب وصولها، على سبيل المثال، في أنظمة قوائم انتظار الرسائل.

class Queue<T> {    private items: T[] = [];

enqueue(item: T): void { this.items.push(item); }

dequeue(): T | undefined { return this.items.shift(); }

front(): T | undefined { return this.items[0]; }

size(): number { return this.items.length; }}

// مثال مع نوع مخصصinterface Task { id: number; name: string;}const taskQueue = new Queue<Task>();taskQueue.enqueue({ id: 1, name: 'معالجة الطلب' });taskQueue.enqueue({ id: 2, name: 'إرسال البريد الإلكتروني' });


1.3. القائمة المرتبطة (Linked List)

تتكون القائمة المرتبطة من عُقد (nodes)، تشير كل منها إلى التي تليها. على عكس المصفوفة (array)، فإن إدراج العناصر وحذفها في منتصف القائمة لا يتطلب إزاحة جميع العناصر.

class ListNode<T> {    value: T;    next: ListNode<T> | null = null;

constructor(value: T) { this.value = value; }}

class LinkedList<T> { private head: ListNode<T> | null = null;

add(value: T): void { const newNode = new ListNode(value); if (!this.head) { this.head = newNode; return; } let current = this.head; while (current.next) { current = current.next; } current.next = newNode; }

print(): void { let current = this.head; while (current) { console.log(current.value); current = current.next; } }}

// الاستخدامconst list = new LinkedList<string>();list.add('TypeScript');list.add('Python');list.print(); // TypeScript, Python


2. خوارزميات الفرز والبحث



فرز البيانات هو أحد أكثر العمليات شيوعاً. تسمح TypeScript بإنشاء دوال عامة (generic functions) تعمل مع أي نوع من البيانات.



2.1. الفرز السريع (Quick Sort)

واحدة من أكثر الخوارزميات فعالية مع

المدونات

توصيات الكتب