לדלג לתוכן

10.3 מחסנית ותור הרצאה

מחסנית

מחסנית או באנגלית stack הוא מבנה נתונים שמאוד מזכיר רשימה, מחסנית היא מיוחדת בזכות הצורה שבה אנחנו מכניסים ומוציאים איברים למחסנית.
- כדי להכניס איברים למחסנית אנחנו משתמשים בפעולה push, שדוחפת איברים לסוף המחסנית. וכדי להוציא איברים אנחנו משתמשים בפעולה pop, שמוציאה את האיבר האחרון ומחזירה אותו.
Pasted image 20240612180213.png
דמיינו מחסנית כמו בקבוק צר: אנחנו יכולים להשחיל דברים פנימה לבקבוק, וכדי להוציא אותם, אנחנו צריכים לשלוף אותם מהדבר האחרון שהכנסנו עד הדבר הראשון.
למעשה מחסנית היא כמו רשימה מוגבלת, ברשימה אנחנו יכולים לגשת לכל איבר שנרצה כל הזמן ובמחסנית אנחנו יכולים לגשת רק לדבר האחרון שהכנסנו כל הזמן, וכדי לגשת לעוד איברים אנחנו צריכים להוציא עוד ועוד איברים מהמחסנית.
- הקונספט הזה נקרא FILO - first in last out - האיבר הראשון שאנחנו מכניסים למחסנית, יצא תמיד אחרון מהמחסנית.
- דוגמה למימוש stack בפייתון:

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop() if not self.is_empty() else None

    def is_empty(self):
        return len(self.items) == 0

שאלה מודרכת: פלינדרום

בדוק האם מחרוזת היא פלינדרום בשימוש במחסנית בלבד.
- תזכורת: פלינדרום היא סדר של איברים שנקראים אותו הדבר הפוך ורגיל.
דוגמה לפלינדרום: 1234321
פתרון:
בזכות עקרון הFILO של מחסנית, אם נכניס את כל האותיות של מחרוזת למחסנית ונוציא, נקבל את המחרוזת הפוכה. וכך נוכל לבדוק האם המחרוזת הרגילה שווה למחרוזת ההפוכה.

def is_palindrome(s):
    stack = Stack()

    # Push each character into the stack
    for char in s:
        stack.push(char)

    # Pop characters from the stack and compare with the string
    for char in s:
        if char != stack.pop():
            return False

    return True

תור

תור או באנגלית queue הוא מבנה נתונים שמאוד מזכיר רשימה, תור הוא מיוחד בזכות הצורה שבה אנחנו מכניסים ומוציאים איברים לתור.
- כדי להכניס איברים לתור אנחנו משתמשים בפעולה push (לפעמים זה נקרא enqueue), שדוחפת איברים לתחילת התור. וכדי להוציא איברים אנחנו משתמשים בפעולה pop (לפעמים זה נקרא dequeue), שמוציאה את האיבר הראשון ומחזירה אותו.
Pasted image 20240612181708.png
- התור הוא דומה קצת למחסנית, רק שהראשון שנכנס לתור, יוצא ראשון. ולשם כך קיים בתור עקרון FIFO - first in, first out - הראשון שנכנס הוא הראשון שיוצא.
- כדי להשתמש בqueue אפשר להשתמש במודול queue
- .

from queue import Queue
q = Queue(maxsize = 3)
q.put('a')
q.put('b')
q.put('c')
print(q.get())
print(q.get())
print(q.get())

- כאשר אפשר להגדיל גודל מרבי לתור, עם put נדחוף איברים לתור ועם get נוציא מהתור.

סיכום

  • למדנו על מחסנית ותור, אבל מדוע אנחנו צריכים את המבני נתונים האלה? בהמון שאלות בראיונות עבודה יש שאלות על מחסניות ותורים, ובנוסף גם קיימים אלגורימים שנלמד עליהם בהמשך שמשתמשים במחסנית ותורים. אז שימו לב שאתם מבינים ומתנסים עם תורים ומחסניות.

תרגול

  • המשיכו לעשות המון leetcode בעצמכם! לא מצליחים? הכל טוב, תקראו את הפתרונות באינטרנט. המשיכו עד שתשתפרו - גם במחסניות ותורים.