public class ArrayQueue implements Queue { // ΠΡΟΣΟΧΗ 2 δείκτες τώρα: // Ο ένας (index/last),ίδιος με πριν, δείχνει την θέση του νέου στοιχείου. // Ο άλλος (front) ΠΑΝΤΑ δείχνει την θέση του 1ου στοιχείου private static final int DEF_QUEUE_SIZE=20; private Object[] S; //Array of objects private int last ; // last, top, last, position, index, θέση νέου στοιχείου private int front ; // θα δείχνει στο 1 ο στοιχείο // Returns the first item of the Queue public Object front() throws QueueEmptyException { if (isempty()) throw new QueueEmptyException("EMPTY"); return S[first]; //ΔΕΝ ΑΛΛΑΖΕΙ Ο ΔΕΙΚΤΗΣ first // Removes the last item of the Queue public Object remove() throws QueueEmptyException { if (isempty()) throw new QueueEmptyException("EMPTY"); Object o=s[first]; //Γυρνάει πάντα το 1 ο S[first++]=null; return o; // Adds a new item into the Queue - IΔΙΟ ΜΕ ΠΡΙΝ public void add(object item) throws QueueFullException { if (isfull()) throw new QueueFullException("FULL"); S[last++]=item; //Utility Methods //ΠΡΟΣΟΧΗ αυτές τώρα ΑΛΛΑΖΟΥΝ λίγο!!! public int size() { return (last-first); public boolean isempty() { return (last==first); public boolean isfull() {return (last==q.length); private void alignment() { for(int i=first; i<last; i++) Q[i-first] = Q[i]; // shift all Q[i] objects last -= first; // recalculate last value first = 0; // recalculate first value
public class TestQueue { public static void main (String args[]) throws QueueFullException, QueueEmptyException { // st1= // ArrayQueue AS=.. System.out.println("\n=>Testing Queue's Operation: Adding"); { AS.add(st1); catch (QueueFullException e) { System.out.println("OO ΑDD1!! "+e); { System.out.println(AS.front()); catch (QueueEmptyException e) { System.out.println("OO front1!! "+e); { AS.add(st1); catch (QueueFullException e) { System.out.println("OO ΑDD2!! "+e); System.out.println("\n=>Testing Queue's Operation: Deleting"); { System.out.println(AS.front()); System.out.println(AS.remove()); System.out.println(AS.remove()); System.out.println(AS.remove()); catch (QueueEmptyException e) { System.out.println("OO POP!! "+e.getmessage()); System.out.println("\nBye Bye");
Aκολουθούν Ασκήσεις προς Εξοικείωση με την OYΡΑ!!!
Ερωτήματα ΑΣΚΗΣΕΙΣ 1. ιϖλασιάζει το µέγεθοςτου ϖίνακα (µεταφέρει και τα στοιχεία) public void doublequeue() ηµιουργεί ένα ϖίνακα µε διϖλάσια διάσταση αϖό τον αρχικό και µεταφέρει σ αυτόν τα στοιχεία της ουράς Η µέθοδος αυτή ενεργοϖοιείται όταν γεµίσει η ουρά. 2. Πως θα ελέγξω αν µια ουρά ισούται µε µια άλλη //Αϖαιτεί clear & alignment public boolean equals(αrrayqueue otherq) {.. H µέθοδος µϖορεί να γραφτεί µέσα στην κλάση ArrayQueue και να τεσταριστεί στην main ως εξής : ArrayQueue Q1, Q2 = //αρχικοϖοίηση και γέµισµα των δυο ουρών. if (Q1.equals(Q2)) System.out.println("ΙΣΕΣ"); // Τι θα ϖεριέχει η µέθοδος equals: Aν τα µεγέθη τους (size() ) δεν είναι ίσα, εϖιστρέφει false Aλλιώς (σε ίσα µεγέθη) ϖρέϖει να βγάζω ένα-ένα τα (τελευταία) στοιχεία τους µε remove() και να τα συγκρίνω. Αν 2 στοιχεία είναι άνισα θα εϖιστρέψει false, αλλιώς θα συνεχίσει τις συγκρίσεις µέχρι να αδειάσουν και οι 2 ουρές: o Όµως στο τέλος, δεν θέλουµε τις ουρές Α ΕΙΕΣ, άρα ϖρέϖει να χρησιµοϖοιήσουµε ΒΟΗΘΗΤΙΚΕΣ ΣΤΟΙΒΕΣ ώστε αϖό αυτές, να ξαναγεµίσουµε µετά τις αρχικές 3. Πώς θα αντιγράψω µια ουρά Q1 σε µια άλλη Q2. Τι θα ϖεριέχει η µέθοδος copyto: o Πρέϖει να βγάζω ένα-ένα τo (τελευταίo) στοιχείo της Q1 µε remove() και να το βάζω σε µια ΒΟΗΘΗΤΙΚΗ ΣΤΟΙΒΑ ώστε αϖό αυτήν, µετά να γεµίσω (copy) την Q2 aλλά και την αρχική ϖου εν τω µεταξύ άδειασε (µε τα remove()).
4. Να ϖροσθέσετε την ϖαρακάτω µέθοδο στην κλάση ArrayQueue: public Object deleteposition(int n) {... Η µέθοδος δέχεται έναν ακέραιο n και διαγράφει αϖό την ουρά το n στοιχείο της. To στοιχείο (ο2) στην θέση n=2, ϖου θα διαγράψω, δεν θα το βάλω στην βοηθητική ουρά. 5. Να ϖροσθέσετε την ϖαρακάτω µέθοδο στην κλάση ArrayQueue: public Object deleteobject(object obj) {... Η µέθοδος να δέχεται ένα αντικείµενο Object obj και να το διαγράφει αϖό την ουρά σε όϖοια θέση και αν βρίσκεται. Παρόµοια µε την 3. 6. ηµιουργήστε την ϖαρακάτω µέθοδο: public Queue evenqueue(queue inqueue) {.. η οϖοία εϖιστρέφει µία ουρά η οϖοία ϖεριέχει τα στοιχεία, ϖου βρίσκονται στις άρτιες θέσεις της ουράς. Tα στοιχείa ϖου δεν θέλω, δεν θα τα βάλω στην βοηθητική ουρά.
7. ηµιουργήστε µια µέθοδο: public static Queue createrandomqueue(int n) η οϖοία ϖαράγει και εϖιστρέφει µια ουρά ϖου ϖεριέχει n τυχαίους ακέραιους αριθµούς. Χρησιµοϖοιήστε την Math.random() 8. ηµιουργήστε µια µέθοδο public static double findaverage(queue inputqueue) ή οϖοία υϖολογίζει και εϖιστρέφει το µέσο όρο των αριθµών ϖου ϖεριέχει η ουρά inputqueue. Βγάζω ένα ένα τα στοιχεία και τα βάζω στην βοηθητική ουρά ώστε να υϖολογίσω τον µέσο όρο, και µετά ξαναγεµίζω την inputqueue. 9. ιαγραφή µεσαίου όρου ουράς public static int deletemidelement(queue inputqueue) Θα βρώ ϖρώτα το mid=size()/2, και τον διαγράφω όϖως στην 3. 10. ηµιουργήστε µία µέθοδο public static int deleteαvgelement(queue inputqueue) η οϖοία διαγράφει και εϖιστρέφει τον αριθµό ϖου είναι ϖιο κοντά στο µέσο όρο των αριθµών ϖου ϖεριέχει η ουρά inputqueue Αφού βρω ϖρώτα ϖοιο είναι το Average=sum(n i)/n βγάζοντας όλους τους αριθµούς στην βοηθητική στίβα, κατόϖιν θα τους βάλω ϖάλι στην inputqueue ελέγχοντάς ώστε να µην µϖει ο Average. 11. Να γράψετε τον κώδικα για την µέθοδο public static Queue deletefromqueue(queue inputqueue, int item) όϖου inputqueue µια ουρά εισόδου ϖου ϖεριέχει αριθµούς και item ένας αριθµός. Η µέθοδος αυτή δηµιουργεί και εϖιστρέφει µια νέα ουρά ϖου δεν ϖεριέχει τον αριθµό item. Παράδειγµα εκτέλεσης INPUT QUEUE : [100 34 45 12 23 56 78 89 23 ] FILTERED QUEUE (NUMBER 56) : [100 34 45 12 23 78 89 23] Βγάζω ένα ένα τα στοιχεία στην βοηθητική ουρά και τα συγκρίνω µε το item. Μόλις βρώ το στοιχείο γεµίζω την inputqueue.