שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2022 - מבני נתונים
שאלה משפר 4. (25 נק׳)
רשימה מקושרת היא מבנה נתונים הניתן להצגה ממנה ניתונים אשר איזבו אחד מכמו מידע על מי היאיבו הבא זך הלאה. כתבו ב Java קוד אשר מטמיע רשימה מקושרת של Node אשר ייצור איזבו אחד ממשי יטול אשר ביאופון יטיפול האיברים של הרישמה המקושרת, ויהמיהן רשימה מקושרת ביטוח כוללתן חיקויים להותם מכול מכניים יתכניים מכול לתיומים של הרישמה, המחלקה כוללת הרישלות שלם היא עדי ב\ setteres 1 getters 1, ואי, היצגנו ממשנו יעוול עבור מחלקנית אשר יכוללה לאיחור איזביום מכול טיפוסים (כמו מציצי), למשנו, למשנו של סטודנטים בעיזורת בחקירה. יש לכלול בממשי קונספרקטור דיפולטיבי וכן את ממנויות peek,pop,push.
כתבנו main המחזיקים שממוש בממחלקנית ובפעולויות שהגדרתו עבור טיפוסים שוניים שתברחרון.
למעוו הדיר ספק, עליכם ללמנש את החוק בעצמכם ולא יתתן להשתמש בדוגמים מובנים בדברים כמו Stack של Java.
תשובה:
רשימה מקושרת היא מבנה נתונים הניתן להצגה ממנה ניתונים אשר איזבו אחד מכמו מידע על מי היאיבו הבא זך הלאה. כתבו ב Java קוד אשר מטמיע רשימה מקושרת של Node אשר ייצור איזבו אחד ממשי יטול אשר ביאופון יטיפול האיברים של הרישמה המקושרת, ויהמיהן רשימה מקושרת ביטוח כוללתן חיקויים להותם מכול מכניים יתכניים מכול לתיומים של הרישמה, המחלקה כוללת הרישלות שלם היא עדי ב\ setteres 1 getters 1, ואי, היצגנו ממשנו יעוול עבור מחלקנית אשר יכוללה לאיחור איזביום מכול טיפוסים (כמו מציצי), למשנו, למשנו של סטודנטים בעיזורת בחקירה. יש לכלול בממשי קונספרקטור דיפולטיבי וכן את ממנויות peek,pop,push.
כתבנו main המחזיקים שממוש בממחלקנית ובפעולויות שהגדרתו עבור טיפוסים שוניים שתברחרון.
למעוו הדיר ספק, עליכם ללמנש את החוק בעצמכם ולא יתתן להשתמש בדוגמים מובנים בדברים כמו Stack של Java.
תשובה:
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2022סמסטר ב
★★★★★
מבני נתוניםרשימות מקושרותמחסניותגנריותמחלקותאובייקטיםקונסטרוקטורמעקב אחר קודחריגות
כדי לממש מחסנית באמצעות רשימה מקושרת, הגדירו את ראש הרשימה (head) כראש המחסנית. פעולות
push ו-pop יתבצעו תמיד על האיבר הראשון ברשימה, ובכך יבטיחו סיבוכיות זמן קבוע.השאלה דורשת לממש מבנה נתונים דמוי מחסנית (Stack) באמצעות רשימה מקושרת ב-Java, תוך שימוש בגנריות כדי לאפשר אחסון של אובייקטים מכל טיפוס. המחסנית תתמוך בפעולות
ראשית, נגדיר את מבנה החוליה (Node) של הרשימה המקושרת. מכיוון שהמימוש של החוליה קשור באופן הדוק לרשימה עצמה ואין בו צורך מחוץ לה, נהוג להגדיר אותה כמחלקה פנימית סטטית (static nested class). המחלקה
כעת, נגדיר את המחלקה העיקרית,
קונסטרוקטור דיפולטיבי: הקונסטרוקטור ייצור מחסנית ריקה על ידי איפוס המצביע
מימוש הפעולות:
1. `push(E data)`: פעולה זו מוסיפה איבר חדש לראש המחסנית. כדי לעשות זאת, ניצור חוליה
2. `pop()`: פעולה זו מסירה את האיבר מראש המחסנית ומחזירה אותו. ראשית, נבדוק אם המחסנית ריקה (
3. `peek()`: פעולה זו "מציצה" ומחזירה את האיבר שבראש המחסנית מבלי להסיר אותו. בדומה ל-
להלן הקוד המלא, כולל מחלקת
push, pop, ו-peek.ראשית, נגדיר את מבנה החוליה (Node) של הרשימה המקושרת. מכיוון שהמימוש של החוליה קשור באופן הדוק לרשימה עצמה ואין בו צורך מחוץ לה, נהוג להגדיר אותה כמחלקה פנימית סטטית (static nested class). המחלקה
Node תהיה גם היא גנרית.כעת, נגדיר את המחלקה העיקרית,
LinkedListStack<E>, שתנהל את הרשימה. היא תחזיק רפרנס בלבד לחוליה הראשונה ברשימה, אותה נכנה head. כאשר הרשימה (המחסנית) ריקה, head יהיה null.קונסטרוקטור דיפולטיבי: הקונסטרוקטור ייצור מחסנית ריקה על ידי איפוס המצביע
head.מימוש הפעולות:
1. `push(E data)`: פעולה זו מוסיפה איבר חדש לראש המחסנית. כדי לעשות זאת, ניצור חוליה
Node חדשה עם הנתונים. המצביע next של החוליה החדשה יוגדר להצביע על ה-head הנוכחי, ולאחר מכן, ה-head של הרשימה יעודכן להצביע על החוליה החדשה. פעולה זו מתבצעת בסיבוכיות זמן של .2. `pop()`: פעולה זו מסירה את האיבר מראש המחסנית ומחזירה אותו. ראשית, נבדוק אם המחסנית ריקה (
head == null). אם כן, נזרוק חריגה (למשל, NoSuchElementException). אחרת, נשמור את הנתונים מה-head הנוכחי, נעדכן את head להצביע על האיבר הבא (head.next), ונחזיר את הנתונים ששמרנו. גם פעולה זו מתבצעת בסיבוכיות זמן של .3. `peek()`: פעולה זו "מציצה" ומחזירה את האיבר שבראש המחסנית מבלי להסיר אותו. בדומה ל-
pop, נבדוק אם המחסנית ריקה. אם לא, פשוט נחזיר את הנתונים מה-head.להלן הקוד המלא, כולל מחלקת
main המדגימה את השימוש עבור טיפוסים שונים (Integer, String, ואובייקט מותאם אישית Student).