המדריך השלם | |||||
|
|
מחסנית ותור
פרק זה דן במחסניות ותורים שהם למעשה ואריאציה על מבני נתונים של רשימה. מכיוון שדנו בנושא בפרק שעבר בהרחבה נתמקד כאן יותר בתכונות הייחודיות למחסנית ותור. המחסנית והתור שייכים לקבוצה הנקראת מבנה נתונים מופשט (Abstract Data Type) -כלומר הם מאופיינים ע"י תכונות ייחודיות ועל ידי קבוצת פעולות בסיסיות. המחסנית (stack) מחסנית - הינה מבנה נתונים מופשט. התכונה העיקרית שלה היא שהאיבר הראשון שיוכנס אליה יהיה הראשון לצאת (first in last out) - כלומר הוצאה והכנסה של איבר אפשרית רק מלמעלה (מראש המחסנית).
ראש המחסנית הוא האיבר העליון. הפעולות: push - דחיפת איבר לראש המחסנית. pop - שליפת איבר מראש המחסנית (שליפת ראש המחסנית). init - אתחול המחסנית,האיבר הראשון של המחסנית שווה ל null נממש את המחסנית באמצעות רשימה שבה כל פעולות ההכנסה וההוצאה מתבצעות בקצה אחד בלבד. המחסנית הינה רשימה שהפעולות של הכנסת איברים והוצאתם נעשית בכיוון אחד ולכן מבנהו של המחסנית זהה לשל הרשימה (רק כאן אנו נגדיר ששמו של המבנה הוא stack ולא list על מנת שהדבר יהיה ברור). מבנה של המחסנית:
()push - הכנסת איבר לראש המחסנית:
stack (מחסנית) הוא מבנה רשימתי כלומר מכיל שדות רגילים בחלקו הראשון וחלקו השני מצביע לאיבר הבא. הפרמטר של הפונקציה ()push הוא מצביע למצביע (המכיל את הכתובת של ראש המחסנית/רשימה). האיבר הראשון של המחסנית נשמר במשתנה second (כשמו כן הוא - יכיל את האיבר השני של המחסנית), מקצים מקום בזיכרון לראש החדש של המחסנית, מאתחלים את שדהו הפשוט (אם יש מספר כאלה אז דואגים להקנות להם ערכים) ואת שדהו המצביע שיצביע על הראש הקודם של המחסנית (כזכור ערך זה נשמר במשתנה second). בפעם הראשונה שנכנס לפונקציה, המחסנית ריקה ולכן *head שווה ל null (=second). מקצים מקום בזיכרון לאיבר הראשון של המחסנית, מאתחלים את שדהו הפשוט ואחר כך את שדה המצביע שיצביע ל- null (כי senond = null). בפעם הבאה ניצור שוב איבר ראשון חדש למחסנית והוא יצביע לאיבר הראשון שכעת יצרנו. ()pop - הוצאת איבר מראש המחסנית:
הפרמטר של הפונקציה ()push הוא מצביע למצביע (המכיל את הכתובת של ראש המחסנית/רשימה). בודקים אם יש איברים במחסנית (*head מכיל את הכתובת של האיבר הראשון במחסנית) ומסיימים אם המחסנית ריקה. אחרת יש צורך למחוק את האיבר שבראש המחסנית. המחיקה מתבצעת באופן הבא: המשתנה temp שומר את הכתובת של האיבר הראשון במחסנית. מקדמים את האיברים במחסנית כלומר האיבר הראשון החדש במחסנית יהיה האיבר השני במחסנית הקודמת (לפני שקידמנו איבר) ולבסוף משחררים את הזיכרון של האיבר הראשון הקודם. כעת נממש את שתי הפונקציות שהוסברו בתוכנית אחת: דוגמא 1:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
תור מבנה נתונים מופשט. תכונתו העיקרית היא הכנסה והוצאה של איברים דרך התאים שבקצוות -הכנסה של האיברים דרך קצה אחד והוצאתם דרך הקצה האחר.
הכנסה מהתא הימני ביותר, הוצאה מהתא השמאלי ביותר. התא השמאלי ביותר הוא ראש התור. האיבר הראשון שהוכנס לתור הוא יהיה הראשון לצאת (first in first out). הפעולות: append - הוספת איבר לתור. Remove - סילוק איבר מהתור. init - אתחול התור. נממש את התור באמצעות רשימה שבה כל פעולות ההכנסה מתבצעת דרך קצה אחד ופעולת ההוצאה מתבצעות דרך הקצה האחר. דוגמא 2:
|