מחסנית היא כמו ערימת צלחות: מניחים למעלה ולוקחים מלמעלה. תור הוא כמו תור לקופה: מי שהגיע ראשון יוצא ראשון. כאן מכניסים ומוציאים ערכים משניהם באותו זמן ורואים את ההבדל, ובסוף בודקים סוגריים מאוזנים בעזרת מחסנית. כדאי לחזור קודם על רשימות בפייתון ועל מחלקות ועצמים.
Last In, First Out: האחרון שנכנס יוצא ראשון. ברשימה של פייתון, append דוחף לסוף ו-pop() מוציא מהסוף.
stack = []
stack.append(1)
stack.append(2)
print(stack.pop()) # 2
First In, First Out: הראשון שנכנס יוצא ראשון. deque מ-collections מוציא מההתחלה מהר, עם popleft().
from collections import deque
queue = deque()
queue.append(1)
queue.append(2)
print(queue.popleft()) # 1
מחסנית: כפתור "בטל" בעורך, חזרה אחורה בדפדפן, בדיקת סוגריים, קריאות לפונקציות. תור: הדפסות שמחכות למדפסת, תור של שחקנים למשחק, הודעות שמחכות לטיפול.
התוכנית מכניסה את אותם מספרים גם למחסנית וגם לתור, ואז מוציאה מכל אחד. הזיזו את המחוונים כדי לבחור כמה מכניסים וכמה מוציאים. לחצו "שורה הבאה" וראו את הקופסאות זזות.
נסו את אלה:
אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות.
pop ממחסנית ריקהpop על רשימה ריקה נותן IndexError: pop from empty list. בודקים לפני שמוציאים.
✗ עלול להיכשל
top = stack.pop()✓ בודקים קודם
if stack:
top = stack.pop()pop(0), לא pop()תור ברשימה רגילה צריך להוציא מההתחלה. pop() בלי מספר מוציא מהסוף, וזו כבר מחסנית.
✗ זו מחסנית
first = line.pop()✓ תור
first = line.pop(0)pop(0) איטי ברשימות ארוכותpop(0) מזיז את כל שאר הערכים מקום אחד. בתור ארוך עדיף deque, שמוציא מההתחלה בלי להזיז כלום.
✗ איטי
line = []
first = line.pop(0)✓ מהיר
line = deque()
first = line.popleft()ב-([)] יש מספר שווה של פותחים וסוגרים, אבל הסדר שגוי. רק מחסנית תופסת את זה.
✗ רק סופרים
ok = text.count("(") == text.count(")")✓ מחסנית
ok = balanced(text)כל סוגר פותח נכנס למחסנית. כל סוגר סוגר צריך להתאים לפותח שבראש המחסנית, ואז מוציאים אותו. בסוף המחסנית צריכה להיות ריקה. בחרו מחרוזת ועברו צעד אחרי צעד.
במחסנית האחרון שנכנס יוצא ראשון (LIFO), כמו ערימת צלחות. בתור הראשון שנכנס יוצא ראשון (FIFO), כמו תור לקופה. אם מכניסים 10, 20, 30, מחסנית תוציא קודם 30 ותור יוציא קודם 10. נסו במעבדה.
עוברים על התווים. סוגר פותח דוחפים למחסנית. סוגר סוגר משווים לראש המחסנית: אם הם זוג מתאים מוציאים, ואם לא, הביטוי לא מאוזן. בסוף המחסנית צריכה להיות ריקה.
ברשימה, pop(0) מזיז את כל הערכים שאחרי הראשון, וזה לוקח זמן כשהרשימה ארוכה. deque בנוי כך שאפשר להוסיף ולהוציא משני הצדדים מהר. תרגלו למטה.