פרק 4 – מחלקת Stack⟨T⟩


עבודה עם מחסנית – LIFO, Push ו‑Pop

מחסנית (Stack) היא מבנה נתונים המתנהג לפי עיקרון Last‑In‑First‑Out: הפריט האחרון שנכנס הוא הראשון שיוצא. בפרק זה נלמד כיצד לעבוד עם מחסנית גנרית <Stack<T ב‑C# ונעמוד על יתרונותיה וחסרונותיה.

מהי מחסנית?

אנימציה

הגדרה ותיאור

מחסנית היא רשימה ליניארית שבה כל ההוספות והמחיקות מתבצעות בקצה אחד בלבד הנקרא Top. הפעולה הבסיסית של המחסנית היא Push (דחיפה) – הוספת פריט לראש המחסנית – ו‑Pop (שליפה) – הסרת הפריט האחרון שהוכנס. ניתן גם להציץ בפריט בראש המחסנית באמצעות Top מבלי להסיר אותו.

מימוש מחסנית ב‑C#

ההמלצה שלי היא להשתמש בהפנייה ל-Unit4.dll. דרך מהירה לכך היא על ידי Git Clone של הפרוייקט Turtle22 בקישור זה

מימוש רשמי

מימוש רשמי של משרד החינוך:

// Unit4 המימוש הרשמי של 
public class Stack<T>
{
    private Node<T> head;

    //-----------------------------------
    //constructor
    public Stack()
    {
        this.head = null;
    }
    //-----------------------------------
    //adds element x to the top of the stack
    public void Push(T x)
    {
        Node<T> temp = new Node<T>(x);
        temp.SetNext(head);
        head = temp;
    }
    //-----------------------------------
    //removes & returns the element from the top of the stack
    public T Pop()
    {
        T x = head.GetValue();
        head = head.GetNext();
        return x;
    }
    //-----------------------------------
    //returns the element from the top of the stack
    public T Top()
    {
        return head.GetValue();
    }
    //-----------------------------------
    //returns true if there are no elements in stack
    // ...כיוון שאני לא מטיפוסל בלי קצת כתיב מקוצר
    public bool IsEmpty() => head == null;
    //-------------------------------------
    //ToString
    public override string ToString()
    {
        if (this.IsEmpty())
            return "[]";
        string temp = head.ToString();
        return "TOP <== " + temp.Substring(0, temp.Length - 1) + "]";
    }
}

דיאגרמה – פעולות המחסנית

Stack Operations:

graph LR
    subgraph Stack
        0[13 Top]
        12[7]
        10[52]
        11[11]
        3[33]
        4[4]
        6[6]
        14[7 - bottom]
    end
    
    Push[Push → מוסיף כאן] --> 0
    0 --> Top[Top → **מציץ** לכאן
    Pop ⟶ **שולף** מפה]

פעולות זמינות במחלקת <Stack<T

תיאור Method
דוחף פריט לראש המחסנית Push(T item)
מסיר ומחזיר את הפריט האחרון שנכנס ()T Pop
מחזיר את הפריט האחרון מבלי להסיר ()T Top
מחזיר אמת אם המחסנית ריקה ()bool IsEmpty

עקרון פעולה LIFO

(Last-In, First-Out) האחרון שנכנס הוא הראשון שיוצא. כמו במחסנית של נשק, וכמו ב-Pez Dispenser.

הערות וטעויות נפוצות

א. ניסיונות קריאה ל‑Pop או Top על מחסנית ריקה יגרמו לחריגה(Exception). יש לוודא שהמחסנית אינה ריקה לפני קריאה לפעולות אלו.

ב. מחסנית מתאימה לאלגוריתמים הפועלים בסדר הפוך (כגון חישוב ביטויים בפולנית הפוכה). שימוש לא נכון עלול לגרום ללוגיקה שגויה.

ג. מומלץ להפיכת תורים כפי שנראה בהמשך.

ד. לא רשאים להשתמש ב-ToString כטכניקה להשוואת מחסניות.

תרגול וקישורים

תוכלו למצוא תרגילים במערכת ההגשות