Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Σχετικά έγγραφα
Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ µε JAVA

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Ευφυείς Τεχνολογίες ----Πράκτορες

Δομές Δεδομένων & Αλγόριθμοι

Συλλογές, Στοίβες και Ουρές

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

public class ArrayStack implements Stack {

Δομές Δεδομένων (Data Structures)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

4 ΔYNAMIKEΣ ΔOMEΣ ΔEΔOMENΩN

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

public class ArrayQueue implements Queue {

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Δοµές Δεδοµένων. 7η Διάλεξη Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Βασικές Δομές Δεδομένων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Βασικές Έννοιες Δοµών Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Βασικές οµές εδοµένων

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Στοίβες. ΟΑΤ της Στοίβας. Περιγραφή και Υλικό Ανάγνωσης. Αφηρηµένοι Τύποι εδοµένων (AΤ )

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

ιαφάνειες παρουσίασης #11

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα μέσα σε αντικείμενα Αντικείμενα ως επιστρεφόμενες τιμές Αντικείμενα με πίνακες

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Κεφάλαιο 5 Συλλογές, Στοίβες και Ουρές

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Δομές Δεδομένων & Αλγόριθμοι. Στοίβες. Εργαστήριο Γνώσης & Ευφυούς Πληροφορικής 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Οι δομές δεδομένων στοίβα και ουρά

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Συνδεδεμένη Λίστα ΣΛ null VK 23

Σι θα δούμε σε αυτό το μάθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Αντικειµενοστρεφής Προγραµµατισµός

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Οντοκεντρικός Προγραμματισμός

υναµικές οµές εδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Κεφάλαιο 3 : εδοµένα. Πίνακες Στοίβα Ουρά Αναζήτηση Ταξινόµηση. Προγράµµατα

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Μάθημα 21: Ουρές (Queues)

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Αντικειμενοστρεφής Προγραμματισμός

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διάλεξη 08: ΛίστεςΙΙ Κυκλικές Λίστες. Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων και Αλγόριθμοι

Διορθώσεις σελ

POINTERS, AGGREGATION, COMPOSITION

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Δομές Δεδομένων Ενότητα 4

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΗΥ 252 Αντικειμενοστρεφ ής Προγραμματισμός Διδάσκων: Γιάννης Τζίτζικας

Στοίβες με Δυναμική Δέσμευση Μνήμης

Ουρά Προτεραιότητας (priority queue)

Το ισχυρό πλεονέκτηµα των απλών µη ταξινοµηµένων πινάκων που είναι η γρήγορη εισαγωγή, αναιρείται αν απαγορεύονται τα διπλότυπα.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Transcript:

3 ΣTOIBEΣ KAI OYPEΣ 3.1 ΣΤΟΙΒΕΣ Στοίβα (stack) είναι µία λίστα στην οποία νέα στοιχεία µπορούν να προστεθούν και να αφαιρεθούν µόνο από τη µία άκρη της (κορυφή της στοίβας). Συχνά µία στοίβα αναφέρεται και σαν µία λίστα τύπου LIFO (Last-In-First-Out), για να δηλώνεται έτσι ρητά η βασική της ιδιότητα, ότι το στοιχείο που θα προστεθεί τελευταίο στη στοιβάδα θα αφαιρεθεί πρώτο ή ισοδύναµα το πρώτο στοιχείο που θα προστεθεί στη στοιβάδα, αναγκαστικά πρέπει να αφαιρεθεί τελευταίο. Bασικές πράξεις σε στοίβες: Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω: 1) Δηµιουργία Στοίβας: Mε την πράξη αυτή δηµιουργείται µία κενή στοίβα S, η οποία δεν περιέχει κανένα στοιχείο. 2) Eισαγωγή στοιχείου σε Στοίβα - push(p): Δοθείσης µίας στοίβας S, το στοιχείο P τοποθετείται στην κορυφή της στοίβας S, σαν τελευταίο στοιχείο. 3) Eξαγωγή στοιχείου από Στοίβα - pop( ): Tο στοιχείο P που βρίσκεται στην κορυφή της στοίβας S αφαιρείται από αυτήν και επιστρέφεται. 23

4) Eλεγχος κενής στοιβάδας - isempty( ): Δοθείσης µίας στοίβας S, επιστρέφει την τιµή true, εάν η στοίβα S δεν έχει κανένα στοιχείο, ενώ στην αντίθετη περίπτωση την τιµή false. Επιπλέον των πράξεων αυτών που θεωρούνται βασικές συνήθως ορίζονται και οι πράξεις: 5) Κορυφή της στοίβας - top( ): Tο στοιχείο P που βρίσκεται στην κορυφή της στοίβας S επιστρέφεται, χωρίς όµως να αφαιρεθεί από αυτήν. 6) Μέγεθος της στοίβας - size( ): Δοθείσης µίας στοίβας S επιστρέφει το πλήθος των στοιχείων της (ενεργό µήκος της στοίβας). Η παρακάτω διασύνδεση (interface) ορίζει τον αφηρηµένο τύπο δεδοµένων (abstract data type) στοίβα: public interface Stack public int size(); // επιστρέφει το µέγεθος της στοίβας public boolean isempty(); // αληθεύει εάν η στοίβα είναι κενή public Object top( ) throws StackEmptyException; // επιστρέφει το στοιχείο που βρίσκεται στην κορυφή της στοίβας public void push(object item) throws StackFullException; // εισάγει ένα νέο στοιχείο στην κορυφή της στοίβας public Object pop( ) throws StackEmptyException; // εξάγει και επιστρέφει το στοιχείο που βρίσκεται στην κορυφή της στοίβας Τµήµα Κώδικα 1 24

3.1.1 Yλοποίηση Στοίβας µε τη Bοήθεια Πίνακα Mία στοίβα µπορεί να αναπαρασταθεί µε τη βοήθεια ενός πίνακα (συγκεκριµένου µήκους) και ενός ακεραίου "ενδείκτη" ο οποίος δείχνει το στοιχείο του πίνακα που αποτελεί την κορυφή της στοίβας. S 0 N-1 top O πίνακας αυτός µαζί µε τον ενδείκτη µπορούν να οµαδοποιηθούν µε τη βοήθεια δηλώσεων της κλάσης ArrayStack, που υλοποιεί τον αφηρηµένο τύπο Stack, όπως φαίνεται παρακάτω: public class ArrayStack implements Stack public static final int CAPACITY = 1000; private int capacity; private Object[ ] S; private int top = -1;. 1) Δηµιουργία Στοίβας: Η κενή στοίβα που δηµιουργείται µπορεί να παρασταθεί µε έναν άδειο πίνακα και την αρχική τιµή του ενδείκτη top = -1-1 0 N-1 S top 25

Το µέγεθος της στοίβας µπορεί να καθορίζεται είτε έµµεσα π.χ 1000 στοιχεία είτε άµεσα κατά τη δηµιουργία της στοίβας. Οι δοµητές της κλάσης ArrayStack για τις δύο αυτές περιπτώσεις είναι οι εξής: public ArrayStack( ) this(capacity); public ArrayStack(int cap) capacity = cap; S = new Object[capacity]; 2) Eισαγωγή στοιχείου στη Στοίβα: Η διαδικασία εισαγωγής ενός στοιχείου στη στοίβα συνίσταται στην αύξηση του ενδείκτη top κατά ένα και την τοποθέτηση του στοιχείου στη θέση του πίνακα που δείχνει ο top. Στην περίπτωση που ο χώρος της στοίβας έχει εξαντληθεί από προηγούµενες εισαγωγές στοιχείων, δηµιουργείται κατάσταση εξαίρεσης (υπερχείλιση στοίβας). Η µέθοδος push της ArrayStack είναι η εξής: public void push(object item) if (size( )== capacity) throw new StackFullException("Stack overflow"); S[++top] = item; Η εξαίρεση StackFullException πρέπει να οριστεί µε τη βοήθεια ξεχωριστής κλάσης, η οποία επεκτείνει την κλάση RuntimeException. 3) Eξαγωγή στοιχείου από Στοίβα: Η διαδικασία εξαγωγής ενός στοιχείου από τη στοίβα συνίσταται στην επιστροφή του στοιχείου που βρίσκεται στην κορυφή της στοίβας και τη µείωση του ενδείκτη top κατά ένα. Εάν κατά την πράξη εξαγωγής στοιχείου η στοίβα βρεθεί άδεια δηµιουργείται κατάσταση εξαίρεσης (άδεια στοίβα). 26

public Object pop( ) throws StackEmptyException Object element; if (isempty( )) throw new StackEmptyException("Stack is empty"); element = S[top]; S[top--] = null; //!!! Χρειάζεται για τον garbage collector return element; Η εξαίρεση StackEmptyException πρέπει επίσης να οριστεί µε τη βοήθεια ξεχωριστής κλάσης. 4) Eλεγχος κενής στοίβας: Είτε στην περίπτωση που η στοίβα έχει µόλις δηµιουργηθεί είτε στην περίπτωση που η στοίβα δεν έχει κανένα στοιχείο µετά από διαδοχικές εισαγωγές και εξαγωγές στοιχείων ο ενδείκτης top θα πρέπει να έχει την τιµή -1: public boolean isempty( ) return (top < 0); Στο τµήµα κώδικα 2 δίνεται ολόκληρη η υλοποίηση της κλάσης ArrayStack και στο τµήµα κώδικα 3 των κλάσεων που υλοποιούν τις εξαιρέσεις. public class ArrayStack implements Stack public static final int CAPACITY = 1000; private int capacity; private Object[ ] S; private int top = -1; public ArrayStack( ) this(capacity); 27

public ArrayStack(int cap) capacity = cap; S = new Object[capacity]; public int size( ) return (top+1); public boolean isempty( ) return (top < 0); public void push(object item) if (size( )== capacity) throw new StackFullException("Stack overflow"); S[++top] = item; public Object top( ) throws StackEmptyException if (isempty( )) throw new StackEmptyException("Stack is empty"); return S[top]; public Object pop() throws StackEmptyException Object element; if (isempty()) throw new StackEmptyException("Stack is empty"); element = S[top]; S[top--] = null; //!!! για τον garbage collector return element; Τµήµα Κώδικα 2 28

public class StackEmptyException extends RuntimeException public StackEmptyException(String err) super(err); public class StackFullException extends RuntimeException public StackFullException(String err) super(err); Τµήµα Κώδικα 3 Σαν ένα παράδειγµα χρήσης της στοίβας στο τµήµα κώδικα 4 δίνεται η κλάση ReverseArray η οποία υλοποιεί τη διαδικασία αντιστροφής των στοιχείων ενός πίνακα χρησιµοποιώντας τις βασικές πράξεις της στοίβας. import java.io.*; class ReverseArray public static String[ ] Reverse(String[ ] a) int i; ArrayStack s = new ArrayStack( ); for (i=0; i<a.length; ++i) s.push(a[i]); i=0; while (!s.isempty( )) a[i]=(string)s.pop(); i++; return a; 29

public static void main(string[ ] args) throws IOException String b[ ] = "nikos","demos","maria","lina","thomas"; String c[ ] = new String[b.length]; ReverseArray RA = new ReverseArray(); c = RA.Reverse(b); for (int i=0; i<c.length; ++i) System.out.println(c[i]); Τµήµα Κώδικα 4 3.2 OYPEΣ Oυρά (queque) είναι µια λίστα στην οποία µπορούν να προστεθούν στοιχεία µόνο στη µία άκρη (πίσω) και να αφαιρεθούν µόνο από την άλλη (µπροστά). Mια ουρά αναφέρεται και σαν λίστα τύπου FIFO (First-In- First-Out). Bασικές πράξεις σε ουρές: Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο ουρά είναι οι εξής: 1) Δηµιουργία Oυράς: Mε την πράξη αυτή δηµιουργείται µία κενή ουρά Q, η οποία δεν περιέχει κανένα στοιχείο. 2) Eισαγωγή στοιχείου σε Oυρά - enqueue(p): Δοθείσης µίας ουράς Q, το στοιχείο P τοποθετείται στο πίσω µέρος της σαν τελευταίο στοιχείο. 3) Eξαγωγή στοιχείου από Oυρά - dequeue(p): Δοθείσης µίας ουράς Q, το στοιχείο P που βρίσκεται στην αρχή της αφαιρείται από αυτήν και επιστρέφεται. 4) Eλεγχος κενής Oυράς - isempty( ): Eπιστρέφει την τιµή true, εάν η ουρά Q είναι κενή, ενώ στην αντίθετη περίπτωση την τιµή false. Επιπλέον των πράξεων αυτών που θεωρούνται βασικές συνήθως ορίζεται και η πράξη: 30

5) Μέγεθος της ουράς - size( ): Δοθείσης µίας ουράς Q επιστρέφει το πλήθος των στοιχείων της (ενεργό µήκος της ουράς). 6) Πρώτο στοιχείο της ουράς - front( ): Δοθείσης µίας ουράς Q επιστρέφει το πρώτο στοιχείο της ουράς, χωρίς όµως να το αφαιρεί από αυτήν. Η παρακάτω διασύνδεση (interface) ορίζει τον αφηρηµένο τύπο δεδοµένων (abstract data type) ουρά (τµήµα κώδικα 5). Στο τµήµα κώδικα 6 δίνονται οι κλάσεις που υλοποιούν τις εξαιρέσεις που σχετίζονται µε την ουρά: public interface Queue public int size( ); // επιστρέφει το µέγεθος (αριθµός στοιχείων) της ουράς public boolean isempty( ); // αληθεύει εάν η ουρά είναι κενή public Object front( ) throws QueueEmptyException; // επιστρέφει το στοιχείο που βρίσκεται στo εµπρός µέρος της ουράς public void enqueue(object item); // εισάγει ένα νέο στοιχείο στο πίσω µέρος της ουράς public Object dequeue( ) throws QueueEmptyException; // εξάγει και επιστρέφει το στοιχείο που βρίσκεται // στo εµπρός µέρος της ουράς Τµήµα κώδικα 5 public class QueueEmptyException extends RuntimeException public QueuekEmptyException(String err) super(err); 31

public class QueueFullException extends RuntimeException public QueueFullException(String err) super(err); Τµήµα Κώδικα 6 3.2.1 Yλοποίηση Oυράς µε τη Bοήθεια Πίνακα Mια ουρά µπορεί να αναπαρασταθεί µε τη βοήθεια ενός πίνακα και δύο ακεραίων ενδεικτών από τους οποίους ο ένας δείχνει το στοιχείο του πίνακα που αποτελεί το τελευταίο στοιχείο της ουράς και ο άλλος το στοιχείο του πίνακα που αποτελεί το πρώτο στοιχείο της. Q 0 N-1 first last O πίνακας αυτός µαζί µε τους δύο ενδείκτες µπορούν να οµαδοποιηθούν µε τη βοήθεια δηλώσεων της κλάσης ArrayQueue, που υλοποιεί τον αφηρηµένο τύπο Queue, όπως φαίνεται παρακάτω: public class ArrayQueue implements Queue public static final int CAPACITY = 1000; private int capacity; private Object[ ] Q; private int first = 0; private int last = 0;.. 32

1) Δηµιουργία Oυράς: Το µέγεθος της ουράς µπορεί να καθορίζεται είτε έµµεσα π.χ 1000 στοιχεία είτε άµεσα κατά τη δηµιουργία της. Οι δοµητές της κλάσης ArrayQueue για τις δύο αυτές περιπτώσεις είναι οι εξής: public ArrayQueue() this(capacity); public ArrayQueue(int cap) capacity = cap; Q = new Object[capacity]; Κατά την αρχική δηµιουργία της ουράς οι τιµές των ενδεικτών first και last είναι 0. Q 0 N-1 first last 2) Εισαγωγή Στοιχείου στην Ουρά: Η διαδικασία εισαγωγής ενός στοιχείου στην ουρά συνίσταται στην τοποθέτηση του στοιχείου στη θέση του πίνακα που δείχνει ο ενδέικτης last και στη συνέχεια την αύξηση του ενδείκτη κατά ένα. Στην περίπτωση που ο χώρος της ουράς έχει εξαντληθεί από προηγούµενες εισαγωγές στοιχείων, δηµιουργείται κατάσταση εξαίρεσης (υπερχείλιση ουράς). Η µέθοδος enqueue της ArrayQueue είναι η εξής: public void enqueue(object item) if (last == capacity) throw new QueueFullException("Queue overflow"); Q[last++] = item; 33

Η εξαίρεση QueueFullException έχει οριστεί µε τη βοήθεια ξεχωριστής κλάσης, η οποία επεκτείνει την κλάση RuntimeException. Πρέπει να σηµειωθεί ότι κατά κανόνα η κατάσταση της υπερχείλισης της ουράς είναι εικονική, µε την έννοια ότι ο πίνακας διαθέτει άδεια στοιχεία, τα οποία µε βάση τη συγκεκριµένη υλοποίηση της enqueue δεν µπορούν να χρησιµοποιηθούν. Υπάρχουν διάφοροι τρόποι αντιµετώπισης της εικονικής υπερχείλισης της ουράς, ένας από τους οποίους δίνεται στην παράγραφο 3.2.2. 3) Εξαγωγή Στοιχείου από την Ουρά: Η διαδικασία εξαγωγής ενός στοιχείου από την ουρά συνίσταται στην επιστροφή του στοιχείου που βρίσκεται στη θέση first του πίνακα και στη συνέχεια την αύξηση του ενδείκτη κατά ένα. Στην περίπτωση που η ουρά είναι άδεια, δηµιουργείται κατάσταση εξαίρεσης (άδεια ουρά). Η µέθοδος dequeue της ArrayQueue είναι η εξής: public Object dequeue( ) throws QueueEmptyException Object item; if (isempty( )) throw new QueueEmptyException("Queue is empty"); item = Q[first]; Q[first++] = null; //!!! για τον garbage collector return item; Η εξαίρεση QueueEmptyException έχει επίσης οριστεί µε τη βοήθεια ξεχωριστής κλάσης. 4) Ελεγχος κενής ουράς: Είτε στην περίπτωση που η ουρά έχει µόλις δηµιουργηθεί είτε στην περίπτωση που η ουρά δεν έχει κανένα στοιχείο µετά από διαδοχικές εισαγωγές και εξαγωγές στοιχείων οι ενδείκτες first και last θα πρέπει να έχουν την ίδια τιµή: public boolean isempty( ) return (first==last); Στο τµήµα κώδικα 7 δίνεται ολόκληρη η υλοποίηση της κλάσης ArrayQueue. 34

public class ArrayQueue implements Queue public static final int CAPACITY = 1000; private int capacity; private Object[ ] Q; private int first = 0; private int last = 0; public ArrayQueue() this(capacity); public ArrayQueue(int cap) capacity = cap; Q = new Object[capacity]; public int size( ) return (last-first); public boolean isempty( ) return (first==last); public void enqueue(object item) if (last == capacity) throw new QueueFullException("Queue overflow"); Q[last++] = item; public Object front( ) throws QueueEmptyException if (isempty( )) throw new QueueEmptyException("Queue is empty"); return Q[first]; 35

public Object dequeue( ) throws QueueEmptyException Object item; if (isempty( )) throw new QueueEmptyException("Queue is empty"); item = Q[first]; Q[first++] = null; //!!! για τον garbage collector return item; Τµήµα Κώδικα 7 Σαν παράδειγµα χρήσης της ουράς στο τµήµα κώδικα 8 φαίνεται η χρήση µιάς ουράς για τη δηµιουργία αντιγράφου ενός πίνακα. import java.io.*; public class QueueTest public static String[ ] QCopy(String[ ] a) int i; ArrayQueue q = new ArrayQueue(); for (i=0; i<a.length; ++i) q.enqueue(a[i]); i=0; while (!q.isempty( )) a[i]=(string)q.dequeue( ); i++; return a; public static void main(string[ ] args) throws IOException String[ ] b = "nikos","demos","maria","lina","thomas"; String[ ] c = new String[b.length]; QueueTest QA = new QueueTest(); c = QA.QCopy(b); for (int i=0; i<c.length; ++i) System.out.println(c[i]); Τµήµα Κώδικα 8 36

3.2.2 Κυκλική Ουρά Όπως αναφέρθηκε στην παράγραφο 3.2.1 η υλοποίηση της ουράς µε τη βοήθεια ενός πίνακα µπορεί να οδηγήσει στο φαινόµενο της εικονικής υπερχείλισης. Ας θεωρήσουµε για παράδειγµα ότι έχουµε εισάγει και στη συνέχεια εξάγει ένα στοιχείο Ν-1φορές στην ουρά. Στην περίπτωση αυτή οι ενδείκτες first και last θα έχουν την τιµή Ν και η επόµενη προσπάθεια εισαγωγής στοιχείου στην ουρά θα οδηγηθεί σε αποτυχία, παρά το γεγονός ότι ο πίνακας που φιλοξενεί τα στοιχεία είναι εντελώς άδειος! Λύση στο πρόβληµα αυτό αποτελεί η κυκλική ουρά. Στην περίπτωση αυτή θεωρούµε ότι το επόµενο στοιχείο του Q[N-1] στον πίνακα είναι το Q[0] εφόσον αυτό είναι κενό. Για να γίνει δυνατή η υλοποίηση της κυκλικής ουράς πρέπει στις πράξεις εισαγωγής και εξαγωγής στοιχείου να τροποποιήσουµε την αύξηση των ενδεικτών µε (first+1)modulon και (last+1)modulon αντίστοιχα, όπου ο τελεστής modulo αντιστοιχεί στο υπόλοιπο της ακεραίας διαίρεσης (στη Java χρησιµοποιείται ο τελεστής %). Μία εικόνα της κυκλικής ουράς µετά από έναν αριθµό πράξεων εισαγωγής - εξαγωγής φαίνεται στο παρακάτω σχήµα: Q 0 N-1 last first Στο τµήµα κώδικα 9 δίνεται η κλάση SArrayQueue που υλοποιεί τον τύπο Queue σαν µία κυκλική ουρά. 37

public class SArrayQueue implements Queue // Υλοποίηση κυκλικής ουράς public static final int CAPACITY = 1000; private int capacity; private Object[ ] Q; private int first = 0; private int last = 0; public SArrayQueue( ) this(capacity); public SArrayQueue(int cap) capacity = cap; Q = new Object[capacity]; public int size( ) return (capacity-first+last)%capacity; public boolean isempty( ) return (first==last); public void enqueue(object item) if (size( ) == capacity) throw new QueueFullException("Queue overflow"); Q[last] = item; last = (last+1)%capacity; public Object front( ) throws QueueEmptyException if (isempty()) throw new QueueEmptyException("Queue is empty"); return Q[first]; 38

public Object dequeue( ) throws QueueEmptyException Object item; if (isempty( )) throw new QueueEmptyException("Queue is empty"); item = Q[first]; Q[first] = null; //!!! για τον garbage collector first=(first+1)%capacity; return item; Τµήµα Κώδικα 9 39

3.3 ΑΣΚΗΣΕΙΣ 1. Δώστε το περιεχόµενο της στοίβας (stack) µετά την εκτέλεση της παρακάτω σειράς από πράξεις: Π Α Ρ * Α * * Π Ο Λ * * * Υ Ε * * * Υ * Κ Ο * Λ Ο * Στην περίπτωση αυτή ένα γράµµα ερµηνεύεται σαν πράξη εισαγωγής (του γράµµατος) στη στοίβα, ενώ ο χαρακτήρας * ερµηνεύεται σαν πράξη εξαγωγής (ενός γράµµατος) από τη στοίβα. 2. Αν η εκτέλεση της σειράς των πράξεων της άσκησης 1 γινόταν σε µία ουρά (queue), ποιό θα ήταν το τελικό της περιεχόµενο; 3. Υλοποιήστε τη δοµή δεδοµένων στοίβα (stack) µε τη χρήση της κλάσης Vector της Java. 4. Μία αριθµητική παράσταση περιέχει παρενθέσεις. Να γραφεί ένα πρόγραµµα το οποίο να ελέγχει εάν οι παρενθέσεις αυτές έχουν χρησιµοποιηθεί σωστά. Να χρησιµοποιηθεί η δοµή δεδοµένων στοίβα. 5. Περιγράψτε πως είναι δυνατή η υλοποίηση µίας στοίβας µε τη βοήθεια δύο ουρών. 6. Υλοποιήστε τη δοµή δεδοµένων ουρά (queue) µε τη χρήση της κλάσης Vector της Java. 7. Περιγράψτε πως είναι δυνατή η υλοποίηση µίας ουράς µε τη βοήθεια δύο στοιβών. 8. Στην περίπτωση της κυκλικής ουράς που παρουσιάστηκε στην παράγραφο 3.2.2 θεωρήστε ότι έχουµε εισάγει Ν στοιχεία, χωρίς να έχουµε εξάγει κανένα. Θα έχουµε τότε first = last όπως ακριβώς και στην περίπτωση που η ουρά είναι άδεια. Πως µπορούµε να αντιµετωπίσουµε αυτό το πρόβληµα; 40