במאמר זה, נדון בתור או בדסק הכפול. ראשית עלינו לראות תיאור קצר של התור.
מה זה תור?
תור הוא מבנה נתונים שבו כל מה שבא ראשון ייצא ראשון, והוא עוקב אחר מדיניות ה-FIFO (First-In-First-Out). הוספה לתור נעשית מקצה אחד המכונה קצה אחורי או ה זָנָב, ואילו המחיקה נעשית מקצה אחר המכונה חזיתי או ה רֹאשׁ של התור.
פקודת git push
הדוגמה בעולם האמיתי של תור היא תור הכרטיסים מחוץ לאולם קולנוע, שבו האדם שנכנס ראשון בתור מקבל את הכרטיס ראשון, והאדם שנכנס אחרון בתור מקבל את הכרטיס סוף סוף.
מהו Deque (או תור כפול)
ה-deque מייצג Double Ended Queue. Deque הוא מבנה נתונים ליניארי שבו פעולות ההכנסה והמחיקה מבוצעות משני הקצוות. אנו יכולים לומר ש-deque הוא גרסה כללית של התור.
אף על פי שניתן לבצע את ההוספה והמחיקה ב-deque בשני קצותיו, היא אינה פועלת לפי כלל ה-FIFO. הייצוג של דסק ניתן כדלקמן -
סוגי דסק
ישנם שני סוגים של דקים -
- תור מוגבל לקלט
- תור מוגבל פלט
תור מוגבל קלט
בתור מוגבל קלט, פעולת ההכנסה יכולה להתבצע רק בקצה אחד, בעוד המחיקה יכולה להתבצע משני הקצוות.
תור מוגבל פלט
בתור מוגבל פלט, פעולת המחיקה יכולה להתבצע בקצה אחד בלבד, בעוד שההכנסה יכולה להתבצע משני הקצוות.
פעולות שבוצעו על בסיס לוח
ישנן את הפעולות הבאות שניתן ליישם על דסק -
- הכנסה בחזית
- הכנסה מאחור
- מחיקה מלפנים
- מחיקה מאחור
כמו כן, נוכל לבצע פעולות הצצה בדסק יחד עם הפעולות המפורטות לעיל. באמצעות תפעול הצצה, נוכל לקבל את האלמנטים הקדמיים והאחוריים של הדסק. אז בנוסף לפעולות לעיל, הפעולות הבאות נתמכות גם ב-deque -
רקע css
- קבל את הפריט הקדמי מהדסק
- קבל את הפריט האחורי מהדסק
- בדוק אם הדק מלא או לא
- בודק אם הלוח ריק או לא
כעת, הבה נבין את הפעולה שבוצעה על בסיס דק באמצעות דוגמה.
הכנסה בקצה הקדמי
בפעולה זו, האלמנט מוכנס מהקצה הקדמי של התור. לפני יישום הפעולה, עלינו לבדוק תחילה האם התור מלא או לא. אם התור אינו מלא, ניתן להכניס את האלמנט מהקצה הקדמי על ידי שימוש בתנאים הבאים -
- אם התור ריק, גם האחורי וגם הקדמי מאותחלים ב-0. כעת, שניהם יצביעו על האלמנט הראשון.
- אחרת, בדוק את מיקום החזית אם החזית קטנה מ-1 (קדמי<1), then reinitialize it by front = n - 1, כלומר, האינדקס האחרון של המערך.1),>
הכנסה בקצה האחורי
בפעולה זו, האלמנט מוכנס מהקצה האחורי של התור. לפני יישום הפעולה, ראשית עלינו לבדוק שוב האם התור מלא או לא. אם התור אינו מלא, ניתן להכניס את האלמנט מהקצה האחורי על ידי שימוש בתנאים הבאים -
- אם התור ריק, גם האחורי וגם הקדמי מאותחלים ב-0. כעת, שניהם יצביעו על האלמנט הראשון.
- אחרת, הגדל את החלק האחורי ב-1. אם החלק האחורי נמצא באינדקס האחרון (או גודל - 1), אז במקום להגדיל אותו ב-1, עלינו להפוך אותו לשווה ל-0.
מחיקה בקצה הקדמי
בפעולה זו, האלמנט נמחק מהקצה הקדמי של התור. לפני יישום הפעולה, עלינו לבדוק תחילה האם התור ריק או לא.
אם התור ריק, כלומר, חזית = -1, זהו תנאי הזרימה, ולא נוכל לבצע את המחיקה. אם התור אינו מלא, ניתן להכניס את האלמנט מהקצה הקדמי על ידי שימוש בתנאים הבאים -
אם ל-deque יש רק אלמנט אחד, הגדר אחורי = -1 וחזית = -1.
זינאט אמן שחקן
אחרת אם החזית נמצאת בקצה (כלומר חזית = מידה - 1), הגדר חזית = 0.
מערך אובייקטים ב-java
אחרת, הגדל את החזית ב-1, (כלומר, קדמי = קדמי + 1).
מחיקה בקצה האחורי
בפעולה זו, האלמנט נמחק מהקצה האחורי של התור. לפני יישום הפעולה, עלינו לבדוק תחילה האם התור ריק או לא.
אם התור ריק, כלומר, חזית = -1, זהו תנאי הזרימה, ולא נוכל לבצע את המחיקה.
אם ל-deque יש רק אלמנט אחד, הגדר אחורי = -1 וחזית = -1.
אם אחורי = 0 (החלק האחורי מלפנים), הגדר אחורי = n - 1.
אחרת, הקטן את החלק האחורי ב-1 (או, אחורי = אחורי -1).
סמן ריק
פעולה זו מבוצעת כדי לבדוק אם ה-deque ריק או לא. אם חזית = -1, זה אומר שהמבחן ריק.
בדוק מלא
פעולה זו מבוצעת כדי לבדוק אם ה-deque מלא או לא. אם קדמי = אחורי + 1, או קדמי = 0 ואחורי = n - 1, זה אומר שהדסק מלא.
מורכבות הזמן של כל הפעולות לעיל של ה-deque היא O(1), כלומר קבועה.
יישומים של deque
- Deque יכול לשמש גם כמחסנית וגם בתור, מכיוון שהוא תומך בשתי הפעולות.
- Deque יכול לשמש כבודק פלינדרום פירושו שאם נקרא את המחרוזת משני הקצוות, המחרוזת תהיה זהה.
יישום דקוו
כעת, בואו נראה את היישום של deque בשפת התכנות C.
rudyard kipling if הסבר
#include #define size 5 int deque[size]; int f = -1, r = -1; // insert_front function will insert the value from the front void insert_front(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { f=r=0; deque[f]=x; } else if(f==0) { f=size-1; deque[f]=x; } else { f=f-1; deque[f]=x; } } // insert_rear function will insert the value from the rear void insert_rear(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { r=0; deque[r]=x; } else if(r==size-1) { r=0; deque[r]=x; } else { r++; deque[r]=x; } } // display function prints all the value of deque. void display() { int i=f; printf(' Elements in a deque are: '); while(i!=r) { printf('%d ',deque[i]); i=(i+1)%size; } printf('%d',deque[r]); } // getfront function retrieves the first value of the deque. void getfront() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at front is: %d', deque[f]); } } // getrear function retrieves the last value of the deque. void getrear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at rear is %d', deque[r]); } } // delete_front() function deletes the element from the front void delete_front() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[f]); f=-1; r=-1; } else if(f==(size-1)) { printf(' The deleted element is %d', deque[f]); f=0; } else { printf(' The deleted element is %d', deque[f]); f=f+1; } } // delete_rear() function deletes the element from the rear void delete_rear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[r]); f=-1; r=-1; } else if(r==0) { printf(' The deleted element is %d', deque[r]); r=size-1; } else { printf(' The deleted element is %d', deque[r]); r=r-1; } } int main() { insert_front(20); insert_front(10); insert_rear(30); insert_rear(50); insert_rear(80); display(); // Calling the display function to retrieve the values of deque getfront(); // Retrieve the value at front-end getrear(); // Retrieve the value at rear-end delete_front(); delete_rear(); display(); // calling display function to retrieve values after deletion return 0; }
תְפוּקָה:
אז, זה הכל לגבי המאמר. מקווה, המאמר יהיה מועיל ואינפורמטיבי עבורך.