You are on page 1of 32

‫פרק ‪ :10‬תורים ומחסניות‬

‫ראשי פרקים‬
‫❖ תור‬

‫❖ תור דו‪-‬ראשי‬

‫❖ מחסנית‬

‫❖ נושאים נוספים‬
‫הממשק ‪Queue‬‬
‫תור‬
‫הממשק ‪Queue‬‬
‫מטפורת התור‬
‫• לתור יש חזית‪ ,‬ראש‪ ,‬קדמת התור‪ ,‬התחלת התור‪front ,‬‬
‫• לתור יש עורף‪ ,‬זנב‪ ,‬אחורי התור‪ ,‬סוף התור‪rear ,‬‬
‫הממשק ‪Queue‬‬
‫מטפורת התור‬
‫• הוספה לסוף התור‬
‫• איברים נוספים לזנב התור‬
‫• הוצאה מתחילת תור‬
‫• איברים מוצאים מראש התור‬
‫הממשק ‪Queue‬‬
‫• מייצג תור‬
‫• מי שנכנס קודם יוצא קודם‬
‫• מסודר לפי סדר "הגעה"‬
‫• כלומר‪ ,‬לפי סדר כניסה‬

‫• ‪FIFO‬‬
‫• ‪First In, First Out‬‬
‫• זוהי מדיניות התור‬
‫הממשק ‪Queue‬‬
‫מחלקות מממשות‬
‫• מחלקות מממשות‬
‫• ‪ArrayDeque‬‬
‫• ‪LinkedList‬‬

‫• מחלקות נוספות שלא נעסוק בהן‬


‫• ‪PriorityQueue‬‬
‫• ועוד‪...‬‬
Queue ‫הממשק‬
...‫רשימת שיטות חלקית‬

Throws exception Returns special value


Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

For more methods and information, check Interface Queue…


ArrayDeque ‫המחלקה‬
Queue ‫כמימוש של‬
public static void main(String[] args)
{
Queue<String> queue = new ArrayDeque<>(); // []

queue.add("apple"); // [apple]
queue.add("banana"); // [apple, banana]
queue.add("cherry"); // [apple, banana, cherry]

String removedElement = queue.remove(); // "apple", [banana, cherry]

String firstElement = queue.element(); // "banana", [banana, cherry]


}
LinkedList ‫המחלקה‬
Queue ‫כמימוש של‬
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>(); // []

queue.add("apple"); // [apple]
queue.add("banana"); // [apple, banana]
queue.add("cherry"); // [apple, banana, cherry]

String removedElement = queue.remove(); // "apple", [banana, cherry]

String firstElement = queue.element(); // "banana", [banana, cherry]


}
‫ראשי פרקים‬
‫❖ תור‬

‫❖ תור דו‪-‬ראשי‬

‫❖ מחסנית‬

‫❖ נושאים נוספים‬
‫הממשק ‪Deque‬‬
‫תור דו‪-‬ראשי‬
‫הממשק ‪Deque‬‬
‫מטפורת התור הדו‪-‬ראשי‬
‫• לתור דו‪-‬ראשי‪ ,‬יש גם ראש וגם זנב בכל צד‬
‫• ניתן להכניס ולהוציא איברים מכל אחד מהצדדים‬
‫הממשק ‪Deque‬‬
‫• מייצג תור דו‪-‬ראשי‬

‫• שהוא סוג של תור‬


‫הממשק ‪Deque‬‬
‫מחלקות מממשות‬
‫• מחלקות מממשות‬
‫• ‪ArrayDeque‬‬
‫• ‪LinkedList‬‬
Deque ‫הממשק‬
...‫רשימת שיטות חלקית‬

First Element (Head) Last Element (Tail)


OPERATION Throws Throws
Special value Special value
exception exception
Insert addFirst(e) offerFirst(e) addLast(e) offerLast(e)
Remove removeFirst() pollFirst() removeLast() pollLast()
Examine getFirst() peekFirst() getLast() peekLast()

For more methods and information, check Interface Deque…


ArrayDeque ‫המחלקה‬
Deque ‫כמימוש של‬
public static void main(String[] args)
{
Deque<String> deque = new ArrayDeque<>(); // []

deque.addFirst("apple"); // [apple]
deque.addLast("banana"); // [apple, banana]
deque.addFirst("cherry"); // [cherry, apple, banana]

String first = deque.getFirst(); // "cherry", [cherry, apple, banana]


String last = deque.getLast(); // "banana", [cherry, apple, banana]

deque.removeFirst(); // [apple, banana]


deque.removeLast(); // [apple]
}
LinkedList ‫המחלקה‬
Deque ‫כמימוש של‬
public static void main(String[] args)
{
Deque<String> deque = new LinkedList<>(); // []

deque.addFirst("apple"); // [apple]
deque.addLast("banana"); // [apple, banana]
deque.addFirst("cherry"); // [cherry, apple, banana]

String first = deque.getFirst(); // "cherry", [cherry, apple, banana]


String last = deque.getLast(); // "banana", [cherry, apple, banana]

deque.removeFirst(); // [apple, banana]


deque.removeLast(); // [apple]
}
‫ראשי פרקים‬
‫❖ תור‬

‫❖ תור דו‪-‬ראשי‬

‫❖ מחסנית‬

‫❖ נושאים נוספים‬
‫מחסנית‪Stack ,‬‬
‫הערת פתיחה‪ :‬מחסנית בג'אווה‬
‫• בג'אווה ישנה מחלקה בשם מחסנית – ‪Stack‬‬
‫• השימוש במחלקה ‪ Stack‬כמימוש למחסנית אינה מומלצת‬

‫• ניתן להשתמש בממשק ‪ Deque‬כמחסנית‬


‫• הוא מספק את השיטות הנדרשות ממחסנית‬
‫• כלומר‪ ,‬את השיטות‪push(), pop(), peek() :‬‬
‫הממשק התיאורטי ‪( Stack‬אינו קיים בג'אווה כממשק)‬
‫מטפורת המחסנית‬
‫• למחסנית יש צד אחד בלבד ממנו ניתן להכניס ולהוציא איברים‬
‫• האיברים המוכנסים נערמים זה על גבי זה במחסנית‬
Stack ‫הממשק התיאורטי‬
...‫רשימת שיטות חלקית‬

Operation Description
Push Add an element to the top of a stack
Pop Remove an element from the top of a stack
Peek Get the value of the top element without removing it

For more methods and information, check Interface Deque…


This is a link to the Deque interface as there is no Stack interface in Java.
public static void main(String[] args)
{
// Create an empty stack using ArrayDeque ArrayDeque ‫המחלקה‬
Deque<String> stack = new ArrayDeque<>(); // Stack is empty

// Push elements onto the stack


stack.push("Java");
Stack ‫כמימוש של‬
// Stack: Java
Deque ‫דרך ממשק‬
stack.push("is");
// Stack: is
// Java

stack.push("awesome");
// Stack: awesome
// is
// Java

// Print the top element of the stack without removing it


System.out.println("Top element: " + stack.peek()); // Top element: awesome
// Stack: awesome
// is
// Java

// Remove and print the top element of the stack


System.out.println("Top element: " + stack.pop()); // Top element: awesome
// Stack: is
// Java

// Remove and print the top element of the stack again


System.out.println("Top element: " + stack.pop()); // Top element: is
// Stack: Java
}
public static void main(String[] args)
{
// Create an empty stack using LinkedList
Deque<String> stack = new LinkedList<>(); // Stack is empty
LinkedList ‫המחלקה‬
// Push elements onto the stack
stack.push("Java");
Stack ‫כמימוש של‬
// Stack: Java
Deque ‫דרך ממשק‬
stack.push("is");
// Stack: is
// Java

stack.push("awesome");
// Stack: awesome
// is
// Java

// Print the top element of the stack without removing it


System.out.println("Top element: " + stack.peek()); // Top element: awesome
// Stack: awesome
// is
// Java

// Remove and print the top element of the stack


System.out.println("Top element: " + stack.pop()); // Top element: awesome
// Stack: is
// Java

// Remove and print the top element of the stack again


System.out.println("Top element: " + stack.pop()); // Top element: is
// Stack: Java
}
‫ראשי פרקים‬
‫❖ תור‬

‫❖ תור דו‪-‬ראשי‬

‫❖ מחסנית‬

‫❖ נושאים נוספים‬
‫נושאים נוספים‬
‫בחירת ‪reference type‬‬
‫• יש להגדיר את ה ‪ reference type‬לפי מה המבנה הנדרש‬
‫• תור רגיל ‪Queue --‬‬
‫• תור דו‪-‬ראשי ‪Deque --‬‬

‫• עבור מחסנית יש להשתמש ב ‪ Deque‬עם השיטות היעודיות למחסנית‬


‫• השיטות )(‪push(), pop(), peek‬‬

‫• יש להשתמש בשיטות הרלוונטיות‬


‫• לפי ה ‪ reference type‬שבחרנו‬
‫בחירת מחלקה‬
‫• ‪ ArrayDeque‬נחשב מהיר יותר מ ‪LinkedList‬‬
‫• מאחר שממומש כמערך דינאמי הוא רציף בזיכרון‬
‫• לעומת רשימה מקושרת שאינה רציפה בזיכרון‬

‫• ‪ ArrayDeque‬תופס פחות מקום בזיכרון‬


‫• מאחר שאינו דורש הפנייה לחוליה הבאה והקודמת‬

‫• לכן נעדיף להשתמש בו בדר"כ‬

‫• במקרה שנדרש לאפשר איברים שהם ‪ ,null‬נשתמש ב ‪LinkedList‬‬


‫• מאחר ש ‪ ArrayDeque‬לא תומך באיברים שהם ‪null‬‬
isEmpty() -‫סריקה ע"י לולאה ו‬
public static void main(String[] args) public static void main(String[] args)
{ {
Queue<String> queue = new ArrayDeque<>(); Deque<String> stack = new ArrayDeque<>();

queue.add("apple"); stack.push("apple");
queue.add("banana"); stack.push("banana");
queue.add("cherry"); stack.push("cherry");

while (!queue.isEmpty()) while (!stack.isEmpty())


System.out.println(queue.remove()); System.out.println(stack.pop());
} }
‫ראשי פרקים‬
‫❖ תור‬

‫❖ תור דו‪-‬ראשי‬

‫❖ מחסנית‬

‫❖ נושאים נוספים‬
‫סוף הפרק!‬
‫הפרק הבא‪ :‬קבוצות ומיפויים‬

You might also like