Professional Documents
Culture Documents
פרק 18 - מחסנית
פרק 18 - מחסנית
פרק 18
מבני נתונים – מחסנית Stack -
כמו כן ,הם לא יודעים אילו שני כובעים מבין חמשת הכובעים
אינם בשימוש.
שלושת החכמים התבקשו לקבוע את צבע הכובע שעל ראשם.
לאחר זמן מה ,אחד מבין השלושה קבע כי הצבע שעל ראשו הוא
שחור .כיצד קבע זאת?
נשתמש במחסנית:
בכל פעם שמתבצעת פעולה (פרט לפעולת Undoעצמה) ,נדחוף
למחסנית את תיאורה ואת הפרמטרים שלה.
כאשר המשתמש ירצה לבטל פעולה ,נשלוף את הפעולה שבראש
המחסנית ,ונבצע פעולה המבטלת אותה.
5+([3+2]/{4-1})
5+([3+2]/{4-1}) (
5+([3+2]/{4-1}) ( [
5+([3+2]/{4-1}) ( [
5+([3+2]/{4-1}) ( {
5+([3+2]/{4-1}) { (
5+([3+2]/{4-1}) (
5+([3+2]/{4-1})
!!! הביטוי תקין
SCE-Chapter-18-Stack Shayke Bilu PhD
בדיקת תקינות סוגריים 2 -
)(2+{5*2))+(3/5
)(2+{5*2))+(3/5 (
( ( 2 + 5) + 3
( ( 2 + 5) + 3 (
מה הכוונה?
מחסנית היא טיפוס נתונים לכל דבר :אפשר להגדיר משתנה מטיפוס
מחסנית ,לכתוב פונקציה שמקבלת מחסנית כפרמטר ,להגדיר מערך של
מחסניות ,לכתוב פונקציה שמחזירה מחסנית ,להגדיר משתנה שהוא
מצביע למחסנית ,וכו'.
מצד שני ,מחסנית היא טיפוס נתונים מופשט ,במובן זה שאנחנו יכולים
לעשות את כל הדברים המפורטים מעלה ,מבלי לדעת כיצד היא ממומשת
בזיכרון המחשב.
כל העבודה שלנו עם משתנה מטיפוס מחסנית נעשתה דרך פעולות ממשק
( ,)interfaceמבלי שהתעניינו כלל בשאלה כיצד נעשה בפועל המימוש
( .)implementationהפרדה זו בין ממשק למימוש ,וההסתרה של פרטי
המימוש מהמתכנת ,היא מהמאפיינים של טנ"מ (.)ADT
SCE-Chapter-18-Stack Shayke Bilu PhD
מחסנית כטיפוס נתונים
איך תיעשה ההפרדה בין ממשק למימוש בסביבת העבודה של ?C
נבנה בעצמנו יחידת ספרייה ,stack.hשתכלול את הכותרות של
כל הפונקציות הפועלות על מחסנית (דחיפה ,שליפה ,בדיקה האם
ריק ,איתחול ,הצצה).
נכתוב בקובץ stack.cמימוש לכל הפעולות השונות על מחסנית.
כשמתכנת אחר ירצה להשתמש במחסנית ,הוא יצרף את יחידת
הספרייה שלנו באמצעות ההוראה ” ,#include “stack.hויזמן
את הפונקציות הכלולות בה ,מבלי לדעת כיצד הן מומשו.
שייקה בילו
יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע
מומחה למערכות מידע חינוכיות ,אקדמיות ומנהליות
Top = 5-1
10
typedef struct
}
int top;
stack_item data[STACK_MAX_SIZE[;
} stack;
while (!stack_empty(s3))
stack_push(&s1,stack_pop(&s3));
while (!stack_empty(s1) && !stack_empty(s2) && flag)
if (stack_pop(&s1) != stack_pop(&s2))
flag = 0;
return stack_empty(s1) && stack_empty(s2) && flag;
}
נכתוב את האלגוריתם:
מיון-מיזוג()a,n
אם n = 1אזי החזר a
אחרת:
הכנס את n/2האיברים הראשונים של aלתוך מערך b
הכנס את n/2האיברים האחרונים של aלתוך מערך c
מיון-מיזוג()b,n/2
מיון-מיזוג()c,n/2
מזג את שני המערכים bו c-למערך ,aוהחזר אותו
4 8 3 0 1 2 7 5
4 8 3 0 1 2 7 5
4 8 3 0
SCE-Chapter-18-Stack
SCE-Sami Shamoon College of Shayke
ShaykeBilu - 2012
Bilu PhD
Merge Sort - מיון ומיזוג מחסנית
4 8 3 0 1 2 7 5
33 00 11 22 7 5
44 88
1 2 7 5
4 8 3 0
1 2 7 5
8 3 0
1 2 7 5
3 0
4 8
1 2 7 5
4 30 03
1 2 7 5
4 8 30 03
1 2 7 5
4 8 0 03
1 2 7 5
4 8 0 3
3 0
1 2 7 5
4 8 0
1 2 7 5
4 8 0 3
0 0 3 1 2 7 5
4 8 3
0 3 0 3 1 2 7 5
4 8
0 3 04 3 1 2 7 5
0 3 40 83 1 2 7 5
0 3 40 83 7 5
1 2
0 3 40 83
1 2 7 5
0 3 04 83
2 7 5
0 3 40 83
7 5
1 2
0 3 40 83
1 7 5
0 3
0 3 40 83
1 2 7 5
0 3 40 83
1 2 5
0 3 40 83
1 2
7 5
0 3 40 83
1 2 5
0 3 40 83
1 2 5 7
0 3 40 83 1
2 5 7
0 3 40 83 1 2
5 7
0 3 40 83 1 2 5
0 3 40 83 1 2 5 7
0 0 3
3 40 83 1 2 5 7
0 1 0 3
3 40 83 2 5 7
0 1 20 3
3 40 83 5 7
0 1 20 3
40 83 5 7
0 1 20 3 4
0 83 5 7
0 1 20 3 4 5
0 83 7
0 1 20 3 4 5 7
0 83
0 1 20 3 4 5 7 8
0 3
•