מחסנית (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). יש לוודא שהמחסנית אינה ריקה לפני קריאה לפעולות אלו.
ב. מחסנית מתאימה לאלגוריתמים הפועלים בסדר הפוך (כגון חישוב ביטויים בפולנית הפוכה). שימוש לא נכון עלול לגרום ללוגיקה שגויה.
תרגול וקישורים
לתרגול הוספה והסרה במחסנית תוכלו לגשת לקישורים הבאים:
- ⬅ עברו לתרגיל Push ו‑Pop
-
⬅ עברו לתרגיל מחסנית לביטויים לעדכן את הקישור!!!!
- [⬅ עברו לתרגיל שיווי משקל של טיפוסריים] כרגע חסר