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


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

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

מהי מחסנית?

הגדרה ותיאור

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

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

בהמשך מופיע מימוש פשוט של מחסנית גנרית המבוססת על מערך פנימי ודינאמי. במחסנית זו קיימות פעולות הוספה, הסרה והצצה:

// 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) + "]";
    }
}

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

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

הדיאגרמה מציגה פעולות בסיסיות: בהתחלה המחסנית ריקה; דוחפים את 5 ואז את 10; הצצה מחזירה 10; לאחר מכן שולפים 10, וה־5 נשאר.

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

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

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

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

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

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

לתרגול הוספה והסרה במחסנית תוכלו לגשת לקישורים הבאים: