الخوارزميات وهياكل البيانات بلغة C++: من الأساسيات إلى التقنيات المتقدمة
الخوارزميات وهياكل البيانات هي أساس أي برنامج فعال. بلغة C++ تحصل على تحكم كامل في الذاكرة والأداء، مما يجعل هذه اللغة مثالية لتعلم التفكير الخوارزمي. في هذه المقالة سنشرح المفاهيم الأساسية، ونقدم أمثلة على الكود، ونوضح كيفية تطبيقها عمليًا. المادة مناسبة للمبتدئين وكذلك للمطورين الذين يرغبون في تنظيم معرفتهم.
سننظر في ثلاث مجموعات رئيسية: هياكل البيانات الخطية (المصفوفات، القوائم، الأكوام، الطوابير)، الهياكل الهرمية (الأشجار)، وخوارزميات المعالجة (الترتيب والبحث). كل قسم يحتوي على كود جاهز بلغة C++ مع الشروحات.
1. هياكل البيانات الخطية: المصفوفات، القوائم المرتبطة، الكومة والطابور
الهياكل الخطية هي الأساس الذي يبدأ به العمل مع البيانات. في C++ يتم تنفيذها إما من خلال الأدوات المدمجة أو من خلال الفئات المخصصة.
المصفوفات والمصفوفات الديناميكية (std::vector)
المصفوفة هي أبسط هيكل بحجم ثابت. للمرونة استخدم std::vector:
#include <iostream>#include <vector>
int main() { std::vector<int> numbers = {5, 2, 8, 1, 9}; // إضافة عنصر numbers.push_back(3); // الوصول عبر الفهرس std::cout << "العنصر الثالث: " << numbers[2] << std::endl; // التكرار for (int num : numbers) { std::cout << num << " "; } return 0;}المزايا: وصول سريع O(1)، توافق مع ذاكرة التخزين المؤقت. العيوب: الإدراج/الحذف في المنتصف — O(n).
القائمة المرتبطة (أحادية الاتجاه)
القائمة تتكون من عقد، كل عقدة تخزن بيانات ومؤشرًا للعنصر التالي. التنفيذ بلغة C++:
struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {}};
class LinkedList {private: Node* head;public: LinkedList() : head(nullptr) {} void pushFront(int val) { Node* newNode = new Node(val); newNode->next = head; head = newNode; } void print() { Node* current = head; while (current) { std::cout << current->data << " -> "; current = current->next; } std::cout << "nullptr" << std::endl; } ~LinkedList() { Node* current = head; while (current) { Node* next = current->next; delete current; current = next; } }};متى تستخدم: عمليات إدراج/حذف متكررة في بداية القائمة. البحث — O(n).
الكومة والطابور
الكومة (LIFO) والطابور (FIFO) — هياكل متخصصة. في C++ هناك محولات جاهزة:
#include <stack>#include <queue>
int main() { // الكومة std::stack<int> st; st.push(10); st.push(20); std::cout << "قمة الكومة: " << st.top() << std::endl; // 20 st.pop(); // الطابور std::queue<int> q; q.push(1); q.push(2); std::cout << "الأول في الطابور: " << q.front() << std::endl; // 1 q.pop(); return 0;}2. الهياكل الهرمية: أشجار البحث الثنائية
الأشجار تسمح بتخزين البيانات الهرمية بكفاءة. شجرة البحث الثنائية (BST) هي كلاسيكية في خوارزميات C++.
تنفيذ BST
struct TreeNode { int key; TreeNode* left; TreeNode* right; TreeNode(int k) : key(k), left(nullptr), right(nullptr) {}};
TreeNode* insert(TreeNode* root, int key) { if (!root) return new TreeNode(key); if (key < root->key) root->left =