ساختمان داده در 15دقیقه – آماده برای مصاحبه‌های فنی!

ساختمان داده: مفاهیم کلیدی برای درک بهتر و موفقیت در مصاحبه‌های فنی

درک صحیح ساختمان داده‌ها یکی از مهارت‌های حیاتی برای هر برنامه‌نویسی است که قصد دارد در حوزه فناوری فعالیت کند. در این راهنما، مفاهیم اساسی ساختمان داده را بررسی می‌کنیم تا شما بتوانید هم دانش خود را تقویت کنید و هم در مصاحبه‌های کاری بدرخشید.


۱. آرایه چندبعدی (Multi-Dimensional Array)

📌 تعریف:

آرایه چندبعدی مجموعه‌ای از داده‌ها است که در بیش از یک بعد سازماندهی شده‌اند. برای مثال، یک آرایه دوبعدی مانند یک ماتریس یا جدول داده است که در سطرها و ستون‌ها ذخیره می‌شود.

✨ مثال:


int[,] grades = {
    { 18, 17, 19 },  // نمرات دانش‌آموز اول
    { 15, 14, 16 },  // نمرات دانش‌آموز دوم
    { 20, 19, 18 }   // نمرات دانش‌آموز سوم
};

// دسترسی به نمره دانش‌آموز دوم در درس سوم
Console.WriteLine(grades[1, 2]); // خروجی: 16

توضیح: اینجا یک آرایه دو‌بعدی تعریف کردیم که هر سطر نماینده‌ی یک دانش‌آموز و هر ستون نماینده‌ی یک درس است. مقدار grades[1,2] یعنی مقدار سطر دوم و ستون سوم که برابر 16 است.

۲. لیست پیوندی یک‌طرفه (Singly Linked List)

📌 تعریف:

در لیست پیوندی یک‌طرفه، هر گره (Node) شامل دو بخش است:

  • مقدار داده‌ای
  • اشاره‌گری به گره بعدی
لیست پیوندی از طریق اشاره‌گرهای بین گره‌ها به هم متصل است.

✨ مثال:


class Node {
    public int data;
    public Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class LinkedList {
    public Node head;

    public void Add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    public void Print() {
        Node current = head;
        while (current != null) {
            Console.Write(current.data + " -> ");
            current = current.next;
        }
        Console.WriteLine("null");
    }
}

// استفاده از لیست پیوندی
LinkedList list = new LinkedList();
list.Add(10);
list.Add(20);
list.Add(30);
list.Print(); // خروجی: 10 -> 20 -> 30 -> null

۳. پشته (Stack) - اصل LIFO

📌 تعریف:

پشته یک ساختار داده‌ای است که از اصل آخرین ورودی، اولین خروجی (LIFO) پیروی می‌کند. یعنی آخرین چیزی که اضافه شده است، اولین چیزی است که حذف می‌شود.

✨ مثال:


Stack browserHistory = new Stack();

// باز کردن صفحات جدید
browserHistory.Push("google.com");
browserHistory.Push("github.com");
browserHistory.Push("arshialearn.ir");

// برگشت به صفحه قبلی
Console.WriteLine("Back to: " + browserHistory.Pop()); // خروجی: arshialearn.ir
Console.WriteLine("Back to: " + browserHistory.Pop()); // خروجی: github.com

۴. صف (Queue) - اصل FIFO

📌 تعریف:

صف یک ساختار داده‌ای است که از اصل اولین ورودی، اولین خروجی (FIFO) پیروی می‌کند. یعنی اولین چیزی که اضافه شده است، اولین چیزی است که خارج می‌شود.

✨ مثال:


Queue bankQueue = new Queue();

// افراد در صف بانک منتظر هستند
bankQueue.Enqueue("علی");
bankQueue.Enqueue("مریم");
bankQueue.Enqueue("حسین");

// خدمت‌دهی به اولین نفر
Console.WriteLine("Now serving: " + bankQueue.Dequeue()); // خروجی: علی
Console.WriteLine("Now serving: " + bankQueue.Dequeue()); // خروجی: مریم

۵. درخت جستجوی دودویی (BST - Binary Search Tree)

📌 تعریف:

درخت جستجوی دودویی (BST) یک درخت است که در آن:

  • مقدار گره‌های سمت چپ کوچک‌تر از مقدار والد هستند.
  • مقدار گره‌های سمت راست بزرگ‌تر از مقدار والد هستند.

این ویژگی باعث می‌شود که عملیات جستجو سریع انجام شود.

✨ مثال:


class BSTNode {
    public int Value;
    public BSTNode Left, Right;

    public BSTNode(int value) {
        Value = value;
        Left = Right = null;
    }
}

class BinarySearchTree {
    public BSTNode Root;

    public void Insert(int value) {
        Root = InsertRec(Root, value);
    }

    private BSTNode InsertRec(BSTNode root, int value) {
        if (root == null) return new BSTNode(value);
        if (value < root.Value) root.Left = InsertRec(root.Left, value);
        else if (value > root.Value) root.Right = InsertRec(root.Right, value);
        return root;
    }
}

// استفاده از درخت جستجو
BinarySearchTree tree = new BinarySearchTree();
tree.Insert(50);
tree.Insert(30);
tree.Insert(70);
tree.Insert(20);
tree.Insert(40);
tree.Insert(60);
tree.Insert(80);

✅ تمرین‌ها و توصیه‌ها

📌 تمرین‌ها:

  • یک آرایه دو‌بعدی ایجاد کنید که دمای هوا را در ۷ روز هفته برای صبح، ظهر و شب ذخیره کند. سپس میانگین دما را برای هر روز محاسبه و نمایش دهید.
  • یک لیست پیوندی ایجاد کنید که نام دانش‌آموزان را دریافت کرده و بتواند نام‌ها را چاپ کند. سپس تابعی اضافه کنید که یک دانش‌آموز را حذف کند.
  • یک پشته (Stack) پیاده‌سازی کنید که کارهای روزانه را ذخیره کند. سپس تابعی ایجاد کنید که آخرین کار اضافه‌شده را حذف کند.
  • یک صف (Queue) برای مدیریت مشتریان یک فروشگاه ایجاد کنید. هر بار که مشتری سرویس دریافت کرد، او را از صف حذف کنید.
  • یک درخت جستجوی دودویی (BST) ایجاد کنید و اعداد ۱۰، ۲۰، ۵، ۱۵، ۲۵ را در آن وارد کنید. سپس تابعی بنویسید که یک مقدار را در درخت جستجو کند.

🎯 توصیه‌ها:

  • قبل از پیاده‌سازی، ابتدا ساختار داده را روی کاغذ رسم کنید تا درک بهتری از آن داشته باشید.
  • در هر کد، حتماً حالت‌های خاص مانند لیست خالی یا حذف از آرایه را بررسی کنید.
  • برای فهم بهتر، سعی کنید کدهای نوشته‌شده را گام‌به‌گام اجرا کنید و مقدار متغیرها را مشاهده کنید.
  • هر بار که ساختاری جدید یاد می‌گیرید، چندین مثال واقعی از کاربرد آن در زندگی روزمره پیدا کنید.
  • اگر در درک مفاهیم مشکل دارید، ویدیوهای آموزشی و منابع متنی دیگر را نیز بررسی کنید.

🎯 سوالات در مصاحبه:

آرایه چندبعدی چیست و چه کاربردهایی دارد؟

آرایه چندبعدی یعنی آرایه‌ای که در بیش از یک بعد سازماندهی می‌شود. مثلا یک ماتریس که داده‌ها در ردیف‌ها و ستون‌ها قرار می‌گیرند. از آرایه‌های چندبعدی در مواردی مثل ذخیره‌سازی تصاویر یا جداول بزرگ استفاده می‌شود.


int[,] matrix = {
    {1, 2, 3},  // اولین سطر
    {4, 5, 6}   // دومین سطر
};

Console.WriteLine(matrix[0, 2]); 

تفاوت لیست پیوندی یک‌طرفه با آرایه‌ها در چیست؟

لیست پیوندی یک‌طرفه با آرایه فرق داره چون توی آرایه‌ها داده‌ها به ترتیب در یک مکان ثابت ذخیره میشن، ولی در لیست پیوندی، هر گره به گره بعدی اشاره داره و اندازه‌اش متغیر هست.


class Node {
    public int data; // داده ذخیره شده در گره
    public Node next; // اشاره‌گر به گره بعدی
}

اصول کارکرد پشته (LIFO) را توضیح دهید

پشته یعنی آخرین ورودی، اولین خروجی. آخرین چیزی که وارد میشه، اول بیرون میاد! مثل زمانی که توی مرورگر دکمه برگشت رو می‌زنیم، به آخرین صفحه‌ای که دیدیم برمی‌گردیم.


Stack stack = new Stack();

stack.Push("page1"); 

stack.Push("page2"); 

Console.WriteLine(stack.Pop()); 

فرق صف (FIFO) با پشته چیست و در چه مواردی از هرکدام استفاده می‌شود؟

در صف، اولین ورودی، اولین خروجیه (FIFO). به عنوان مثال، صف بانک. پشته برای ذخیره‌سازی تاریخچه یا عملیات بازگشتی مناسبه.


Queue queue = new Queue();

queue.Enqueue("Ali"); 

queue.Enqueue("Maryam"); 

Console.WriteLine(queue.Dequeue()); 

درخت جستجوی دودویی چیست و چه ویژگی‌هایی دارد؟

درخت جستجوی دودویی یک درخت خاصه که گره‌های سمت چپ کوچکتر از والدش و گره‌های سمت راست بزرگتر از والدش هستند. این ویژگی‌ها کمک می‌کنن که جستجو سریع‌تر بشه.


class BSTNode { 
    public int Value; // مقدار گره
    public BSTNode Left, Right; // اشاره‌گرهای گره‌های چپ و راست
}

چگونه می‌توان یک لیست پیوندی را معکوس کرد؟

برای معکوس کردن لیست، باید اشاره‌گرها رو طوری تغییر بدیم که هر گره به گره قبلی اشاره کنه به جای گره بعدی. اینطوری ترتیب گره‌ها معکوس میشه.

یک الگوریتم جستجو در درخت جستجوی دودویی بنویسید

برای جستجو در درخت جستجوی دودویی، به هر گره نگاه می‌کنیم و بررسی می‌کنیم که آیا مقدار مورد نظر در سمت چپ یا راست گره فعلی قرار داره.


public BSTNode Search(BSTNode root, int value) { 
    
    if (root == null || root.Value == value) return root; 
    
    if (value < root.Value) return Search(root.Left, value); 
    
    return Search(root.Right, value); 
}

چگونه پشته را پیاده‌سازی می‌کنید و چه کاربردهایی برای آن می‌شناسید؟

پشته رو می‌شه با استفاده از لیست پیوندی یا آرایه پیاده‌سازی کرد. کاربردهای اون شامل ذخیره‌سازی تاریخچه مرورگر و مدیریت کارهای بازگشتی هست.

بعد از ثبت نام در این دوره و تایید فاکتور لینک های دانلود برای شما فعال خواهد شد

سرفصل های این دوره :

نظرات کاربران

جهت درج نظر باید وارد سایت شوید