מימוש מחסנית באמצעות תורים בצורה יעילה

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

השאלה: ממשו מחסנית בעזרת שני תורים בצורה יעילה. חשבו את זמן הריצה של הפונקציות הבסיסיות של המחסנית שכתבתם.

מימוש מחסנית באמצעות שני תורים:
קיימות שתי דרכים לממש מחסנית באמצעות שני תורים. ההבדל בין שתי הדרכים הוא היעילות. במימוש הראשון, פעולת pop() יעילה ובמימוש השני, פעולת push(v) יעילה.

נתאר את המימוש הראשון: נחזיק שני תורים queue1 ו-queue2.
נממש את פעולת push(v) שבה עלינו להכניס איבר חדש v לראש המחסנית. לשם כך, נוסיף את האיבר החדש v לתור queue2 בעזרת EnQueue(v). את כל האיברים x בתור queue1 נעביר לתור queue2 בעזרת EnQueue(x). לאחר מכאן, נחליף בין השמות של שני תורים queue1 ו-queue2.
נממש את פעולת pop() שבה עלינו להוציא את האיבר העליון במחסנית. נבצע DeQueue() מהתור queue1.

נתאר את המימוש השני: נחזיק שני תורים queue1 ו-queue2.
נממש את פעולת push(v) שבה עלינו להכניס איבר חדש v לראש המחסנית. לשם כך, נוסיף את האיבר החדש v לתור queue1 בעזרת EnQueue(v).
נממש את פעולת pop() שבה עלינו להוציא את האיבר העליון במחסנית. כל עוד גודל התור queue1 הוא גדול מאחד, נעביר את האיברים מהתור queue1 לתור queue2 בעזרת הפונקציה DeQueue(). נוציא את האיבר האחרון מהתור queue1 אשר יוחזר מפעולת pop() ונשנה את השמות בין שני התורים.

בדרך כלל מעוניינים שפעולת pop() תיהיה יעילה ולכן המימוש הראשון הוא כנראה המימוש שמעניין אותך. כמו כן, כנראה אני צריך משקפיים וחשבתי בהתחלה שצריך לממש תור בעזרת שתי מחסניות אז למי שצריך להלן הפתרון.

מימוש תור באמצעות שני מחסניות:
נממש את התור כך שיכיל שתי מחסניות. המחסנית הראשונה inStack תשמש להכנסת איברים. המחסנית השנייה outStack תשמש להוצאת איברים. כמו כן, נניח שלכל אחת מהמחסניות יש שדה size שמייצג את מספר האיברים בה (אחרת אפשר לתחזק שדה כזה בתור).
בפעולת הכנסה EnQueue(v) אנו מעוניינים להוסיף איבר אחד חדש v בסופו של התור. לכן, נדחף את האיבר למחסנית הראשונה inStack.
בפעולת הוצאה DeQueue() אנו מעוניינים להוציא את האיבר הנמצא בראש התור. לכן, תחילה נבדוק אם המחסנית outStack ריקה ואם כן, אז סיימנו. אחרת, נעביר את האיבר מהמחסנית inStack למחסנית outStack ואז נשלוף מתוכו.
בפעולת isEmpty אנו מעוניינים לבדוק אם התור ריק. נחזיר true אם השדה size של שתי המחסניות הוא אפס, אחרת false.
בפועלת peek אנו מעוניינים לבדוק את הערך בראש התור. לכן אם גודל המחסנית outSize הוא אפס אזי כל עוד המחסנית inStack לא ריקה, נוציא את האיבר הנצא בראש התור ונכניס אותו ל-outStack. לאחר מכאן, נקרא את האיבר ב-top של outStack.

מקווה שמובן, בהצלחה :slight_smile:

תודה חבר !
אבל מה שעשית זה בדיוק הפוך ממה שביקשו אתה מימשת תור בעזרת 2 מחסניות, בשאלה רצו שנממש מחסנית בעזרת 2 תורים

אני חייב משקפיים @Saareli, שים לב לעריכה של תשובתי (השארתי את הפתרון הקודם לטובת הדורות הבאים). מקווה שמובן :slight_smile: