Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Ε. ΠετράκηςΛίστες1  Λίστα: πεπερασμένη σειρά στοιχείων ίδιου τύπου  Οι πράξεις εξαρτώνται από τον τύπο της λίστας και όχι από τον τύπο δεδομένων  Λίστα:
Advertisements

Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Δυναμικοί πίνακες Πολλές δομές δεδομένων υλοποιούνται με χρήση πινάκων
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Ανασκόπηση σε Δείκτες, Ουρές, Στοίβες, Συνδεδεμένες Λίστες
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Γλώσσα C & Unix Τμήμα Πληροφορικής, ΑΠΘ B’ εξάμηνο
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Αντικείμενα ως ορίσματα.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα.
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 9: Διανύσματα και λίστες.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Ψηφιακά Δένδρα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Μπορούμε να χρησιμοποιήσουμε την παραπάνω αναπαράσταση.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Συλλογές.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
Δομές Αναζήτησης TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Χειριζόμαστε ένα σύνολο στοιχείων όπου το κάθε.
Ε. ΠετράκηςΣτοίβες, Ουρές1 Στοίβες  Στοίβα: περιορισμένη ποικιλία λίστας  τα στοιχεία μπορούν να εισαχθούν ή να διαγραφούν μόνο από μια άκρη : λίστες.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
Διερεύνηση γραφήματος. Ένας αλγόριθμος διερεύνησης γραφήματος επισκέπτεται τους κόμβους του γραφήματος με μια καθορισμένη στρατηγική, π.χ. κατά εύρος.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Γενικευμένες κλάσεις Συλλογές.
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Τμ.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη C Ακέραιοι.
Διερεύνηση γραφήματος. Ένας αλγόριθμος διερεύνησης γραφήματος επισκέπτεται τους κόμβους του γραφήματος με μια καθορισμένη στρατηγική, π.χ. κατά εύρος.
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Copy Constructor Deep and Shallow Copies.
Γράφημα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Συνδυαστικό αντικείμενο που αποτελείται από.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πολυμορφισμός – Αφηρημένες κλάσεις Interfaces (διεπαφές)
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies.
Δομές Δεδομένων και Αρχεία
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Συνδετικότητα γραφήματος (graph connectivity). α β Υπάρχει μονοπάτι μεταξύ α και β; Παραδείγματα: υπολογιστές ενός δικτύου ιστοσελίδες ισοδύναμες μεταβλητές.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Παράδειγμα Κληρονομικότητας Γενικευμένες κλάσεις.
Δομές Δεδομένων 7η Διάλεξη Αφηρημένοι Τύποι Δεδομένων Ε. Μαρκάκης.
Δομές Δεδομένων 13η Διάλεξη Πίνακες Συμβόλων Ε. Μαρκάκης.
ΤΕΙ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΣΕΡΡΕΣ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Τ.Ε. Πτυχιακή εργασία Μάρθα Τσολακίδου.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Γράφημα Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα:
Οι Δομές Δεδομένων Ουρά και Στοίβα
Στοιχειώδεις Δομές Δεδομένων: Πίνακες και Λίστες
Διερεύνηση γραφήματος
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
9η Διάλεξη Ταξινόμηση Ε. Μαρκάκης
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας Ε. Μαρκάκης
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
EPL231 – Data Structures and Algorithms
Εισαγωγή στον Προγ/μό Υπολογιστών
Ουρά Προτεραιότητας (priority queue)
Δομές Αναζήτησης Χειριζόμαστε ένα σύνολο στοιχείων όπου το κάθε στοιχείο έχει ένα κλειδί από ολικά διατεταγμένο σύνολο Θέλουμε να υποστηρίξουμε δύο.
Αναδρομικές Εξισώσεις και Αφηρημένοι Τύποι Δεδομένων
19η Διάλεξη Εξωτερική Αναζήτηση και Β-δέντρα Ε. Μαρκάκης
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Μανασσάκης Βασίλης Καθηγητής Πληροφορικής
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Μεταγράφημα παρουσίασης:

Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει ένα αυθαίρετο στοιχείο του συνόλου. Στοίβα (stack) : Επιστρέφει το νεότερο στοιχείο του συνόλου. Ουρά (queue) : Επιστρέφει το παλαιότερο στοιχείο του συνόλου. Ουρά προτεραιότητας (priority queue) : Επιστρέφει το στοιχείο με το μέγιστο (ή το ελάχιστο) κλειδί.

Συλλογή Υποστηρίζει τις λειτουργίες: εισαγωγή(S,x) : τοποθετεί το στοιχείο x στη συλλογή S εξαγωγή(S) : αφαιρεί από την συλλογή S ένα αυθαίρετο στοιχείο της x και το επιστρέφει Μπορεί να υλοποιηθεί εύκολα με πίνακα ή συνδεδεμένη λίστα, έτσι ώστε οι λειτουργίες εισαγωγής και εξαγωγής να γίνονται σε Ο(1) χρόνο.

Στοίβα ώθησης προς τα κάτω στοίβα ώθηση απώθηση Υποστηρίζει τις λειτουργίες: ώθηση(S,x) : τοποθετεί το στοιχείο x στην κορυφή της στοίβας S απώθηση(S) : επιστρέφει το στοιχείο x που βρίσκεται στην κορυφή της στοίβας S και διαγράφει το x από την S

Στοίβα ώθησης προς τα κάτω Διασύνδεση class Stack // στοίβα αντικειμένων τύπου Item { Stack(int) // αρχικοποίηση στοίβας boolean isEmpty() // έλεγχος αν η στοίβα είναι άδεια void push(Item) // ώθηση αντικειμένου Item pop(); // απώθηση αντικειμένου }

Στοίβα ώθησης προς τα κάτω Υλοποίηση - με πίνακα - με συνδεδεμένη λίστα α α β β γ γ δ δ κάτω όριο άνω όριο τρέχουσα κορυφή δ δ γ γ β β α α τρέχουσα κορυφή push(α) push(β) push(γ) push(δ) head stack pointer: δείχνει την επόμενη κενή θέση

Στοίβα ώθησης προς τα κάτω Υλοποίηση με πίνακα class Stack { private Item[] S; private int N; Stack(int maxN) { S = new Item[maxN]; N=0; } boolean isEmpty() { return (N == 0); } void push(Item item) { S[N++] = item; } Item pop() { return S[--N]; } } α α β β γ γ δ δ κάτω όριο 0 άνω όριο maxN-1 τρέχουσα κορυφή stack pointer Ν : δείχνει την επόμενη κενή θέση

Στοίβα ώθησης προς τα κάτω Υλοποίηση με πίνακα class Stack { private Item[] S; private int N; Stack(int maxN) { S = new Item[maxN]; N=0; } boolean isEmpty() { return (N == 0); } void push(Item item) { S[N++] = item; } Item pop() { Item t = S[--N]; S[N] = null; return t; } } α α β β γ γ δ δ κάτω όριο 0 άνω όριο maxN-1 τρέχουσα κορυφή stack pointer Ν : δείχνει την επόμενη κενή θέση Χρειάζεται όταν ο πίνακας S αποθηκεύει αναφορές σε αντικείμενα, έτσι ώστε το σύστημα της Java να γνωρίζει ότι η αντίστοιχη μνήμη μπορεί να απελευθερωθεί.

Στοίβα ώθησης προς τα κάτω Υλοποίηση με πίνακα class Stack { private Item[] S; private int N; Stack(int maxN) { S = new Item[maxN]; N=0; } boolean isEmpty() { return (N == 0); } void push(Item item) { S[N++] = item; } Item pop() { Item t = S[--N]; S[N] = null; return t; } } α α β β γ γ δ δ κάτω όριο 0 άνω όριο maxN-1 τρέχουσα κορυφή stack pointer Ν : δείχνει την επόμενη κενή θέση Χρειάζεται όταν ο πίνακας S αποθηκεύει αναφορές σε αντικείμενα, έτσι ώστε το σύστημα της Java να γνωρίζει ότι η αντίστοιχη μνήμη μπορεί να απελευθερωθεί. Τι γίνεται όμως αν Ν == maxN ;

Στοίβα ώθησης προς τα κάτω Υλοποίηση με συνδεδεμένη λίστα δ δ γ γ β β α α τρέχουσα κορυφή class Stack { private Node head; private class Node { Item item; Node next; Node(Item item, Node next) { this.item = item; this.next = next; } } Stack(int maxN) { head = null; } boolean isEmpty() { return head == null; } void push(Item item) { head = new Node(item, head); } Item pop() { Item item = head.item; Node t = head.next; head = t; return item; } } head

Στοίβα ώθησης προς τα κάτω Υλοποίηση - με πίνακα - με συνδεδεμένη λίστα δ δ γ γ β β α α τρέχουσα κορυφή • Και οι δύο υλοποιήσεις επιτυγχάνουν Ο(1) χρόνο ανά λειτουργία. • Η υλοποίηση με πίνακα είναι πιο γρήγορη στην πράξη. • Η υλοποίηση με πίνακα έχει το μειονέκτημα ότι πρέπει να οριστεί ο μέγιστος αριθμός στοιχείων ( maxN ) στη στοίβα. Το αν αυτό αποτελεί σημαντικό πρόβλημα ή όχι εξαρτάται από την εφαρμογή. head α α β β γ γ δ δ κάτω όριο άνω όριο τρέχουσα κορυφή stack pointer: δείχνει την επόμενη κενή θέση

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων ενθεματική αναπαράσταση μεταθεματική αναπαράσταση

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων ενθεματική αναπαράστασημεταθεματική αναπαράσταση Αντικαθιστούμε με όπου δυαδικός τελεστής

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων ενθεματική αναπαράστασημεταθεματική αναπαράσταση Αντικαθιστούμε με όπου δυαδικός τελεστής

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S 5 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S 5 9 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S = 17 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S *4 =24 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S *17 =408 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S =415 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S *5=2075 Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής , εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z);

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων public static void main(String[] args){ char[] a = args[0].toCharArray(); int N = a.length; Stack S = new Stack(N); for (i = 0; i < N; i++) { if (a[i] == ‘+’) S.push(S.pop()+S.pop()); if (a[i] == ‘*’) S.push(S.pop()*S.pop()); if ((a[i] >= ‘0’) && (a[i] <= ‘9’) S.push(0); while ((a[i] >= ‘0’) && (a[i] <= ‘9’)) S.push(10*S.pop() + (a[i++]-‘0’)); } System.out.println(S.pop() + “”); } Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S (τύπου int )

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S μεταθεματική αναπαράστασηενθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 9 * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση 5 9 * + μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * + μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * * + μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * 7 * + μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * 7 + * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων στοίβα S ενθεματική αναπαράσταση * * 7 + * μεταθεματική αναπαράσταση Χρησιμοποιούμε στοίβα χαρακτήρων S. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ‘(’ : δεν κάνουμε τίποτα - ‘)’ : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push()

Στοίβα ώθησης προς τα κάτω Παράδειγμα: Υπολογισμός απλών αριθμητικών παραστάσεων ενθεματική αναπαράσταση public static main(String[] args) { char[] a = args[0].toCharArray(); int N = a.length; Stack S = new Stack(N); for (i = 0; i < N; i++) { if (a[i] == ‘)’) System.out.print(S.pop() + “ ”); if ((a[i] == ‘*’) || (a[i] == ‘+’)) S.push(a[i]); if ((a[i] >= ‘0’) && (a[i] <= ‘9’)) System.out.print(a[i] + “ “); } System.out.println(“”); } μεταθεματική αναπαράσταση

Στοίβα ώθησης προς τα κάτω στοίβα ώθηση απώθηση Η στοίβα υποστηρίζει τις λειτουργίες: ώθηση(S,x) : τοποθετεί το στοιχείο x στην κορυφή της στοίβας S απώθηση(S) : επιστρέφει το στοιχείο x που βρίσκεται στην κορυφή της στοίβας S και διαγράφει το x από την S Η απώθηση απομακρύνει το στοιχείο που προστέθηκε πιο πρόσφατα LIFO (Last In First Out) ουρά

FIFO Ουρά FIFO ουρά τοποθέτησηλήψη FIFO (First In First Out) ουρά : τοποθέτηση(Q,x) : τοποθετεί το στοιχείο x στo τέλος της ουράς Q λήψη(Q) : επιστρέφει το στοιχείο x που βρίσκεται στην αρχή της ουράς Q και διαγράφει το x από την Q η διαγραφή απομακρύνει το παλαιότερο στοιχείο της ουράς

FIFO Ουρά Διασύνδεση class Queue // ουρά αντικειμένων τύπου Item { Queue(int) // αρχικοποίηση στοίβας boolean isEmpty() // έλεγχος αν η στοίβα είναι άδεια void put(Item) // τοποθέτηση αντικειμένου Item get(); // λήψη αντικειμένου }

FIFO Ουρά Υλοποίηση με συνδεδεμένη λίστα δ δ γ γ β β α α νεότερο στοιχείο class Queue { private class Node { Item item; Node next; Node(Item item) { this.item = item; next = null; } } private Node head, tail; Queue(int maxN) { head = null; tail = null; } boolean isEmpty() { return (head == null); } void put(Item item) { Node t = tail; tail = new Node(item); if (isEmpty()) head = tail; else t.next=tail; } Item get() { item = head.item; Node t = head.next; head = t; return item; } παλαιότερο στοιχείο headtail

FIFO Ουρά Υλοποίηση με πίνακα Ν-1 … Θεωρούμε την ουρά ως ένα αναδιπλωμένο πίνακα q[] : αν η τρέχουσα θέση του πιο πρόσφατου στοιχείου είναι η tail τότε το επόμενο στοιχείο θα εισαχθεί στη θέση (tail+1) % N tail (tail+1) % N

FIFO Ουρά Υλοποίηση με πίνακα Ν-1 … tail head % N class Queue { private Item[] q; private int N, head, tail; Queue(int maxN) { q = new Item[maxN + 1]; N = maxN+1; head = N; tail = 0; } boolean isEmpty() { return (head % N == tail); } void put(Item item) { q[tail++] = item; tail = tail % N; } Item get() { head = head % N; return q[head++]; } }

FIFO Ουρά Υλοποίηση με πίνακα tail head % N αρχική κατάσταση: tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Υλοποίηση με πίνακα tail head % N τοποθέτηση: 7 6 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Υλοποίηση με πίνακα tail head % N τοποθέτηση: 7 6 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Υλοποίηση με πίνακα tail head % N τοποθέτηση: 7 6 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Υλοποίηση με πίνακα tail head λήψη: 7 6 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Υλοποίηση με πίνακα tail head λήψη: 7 6 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

FIFO Ουρά Όπως και στην περίπτωση της στοίβας : • Και οι δύο υλοποιήσεις επιτυγχάνουν Ο(1) χρόνο ανά λειτουργία. • Η υλοποίηση με πίνακα είναι πιο γρήγορη στην πράξη. • Η υλοποίηση με πίνακα έχει το μειονέκτημα ότι πρέπει να οριστεί ο μέγιστος αριθμός στοιχείων ( maxN ) στην ουρά. Το αν αυτό αποτελεί σημαντικό πρόβλημα ή όχι εξαρτάται από την εφαρμογή.

Ουρά δύο άκρων deque Deque (Double Ended Queue) : επιτρέπει εισαγωγή/διαγραφή και στα δύο άκρα της ουράς Μπορεί να υλοποιηθεί με παρόμοιο τρόπο έτσι ώστε να επιτυγχάνει Ο(1) χρόνο ανά λειτουργία

Ουρά δύο άκρων Deque (Double Ended Queue) : επιτρέπει εισαγωγή/διαγραφή και στα δύο άκρα της ουράς Τι συμβαίνει όταν μπορούμε να έχουμε εισαγωγή του ίδιου στοιχείου πάνω από 1 φορά; deque Μπορεί να υλοποιηθεί με παρόμοιο τρόπο έτσι ώστε να επιτυγχάνει Ο(1) χρόνο ανά λειτουργία

Ουρά δύο άκρων Deque (Double Ended Queue) : επιτρέπει εισαγωγή/διαγραφή και στα δύο άκρα της ουράς Τι συμβαίνει όταν μπορούμε να έχουμε εισαγωγή του ίδιου στοιχείου πάνω από 1 φορά; deque Μπορεί να υλοποιηθεί με παρόμοιο τρόπο έτσι ώστε να επιτυγχάνει Ο(1) χρόνο ανά λειτουργία Για να διατηρήσουμε Ο(1) χρόνο ανά λειτουργία σε αυτή την περίπτωση μπορούμε να χρησιμοποιήσουμε την τεχνική του κατακερματισμού που θα δούμε αργότερα…

Ουρά δύο άκρων Deque (Double Ended Queue) : επιτρέπει εισαγωγή/διαγραφή και στα δύο άκρα της ουράς Τι συμβαίνει όταν μπορούμε να έχουμε εισαγωγή του ίδιου στοιχείου πάνω από 1 φορά; deque Μπορεί να υλοποιηθεί με παρόμοιο τρόπο έτσι ώστε να επιτυγχάνει Ο(1) χρόνο ανά λειτουργία Απλή λύση αν τα στοιχεία που εισάγουμε είναι ακέραιοι στο διάστημα [0,Μ-1] : Διατηρούμε ένα πίνακα Μ θέσεων t[] (τύπου boolean ) : t[i]=true αν και μόνο αν το στοιχείο i υπάρχει στην ουρά t[i]=false αν και μόνο αν το στοιχείο i δεν υπάρχει στην ουρά

Ουρά δύο άκρων Deque (Double Ended Queue) : επιτρέπει εισαγωγή/διαγραφή και στα δύο άκρα της ουράς Τι συμβαίνει όταν μπορούμε να έχουμε εισαγωγή του ίδιου στοιχείου πάνω από 1 φορά; deque Μπορεί να υλοποιηθεί με παρόμοιο τρόπο έτσι ώστε να επιτυγχάνει Ο(1) χρόνο ανά λειτουργία Ακόμα και αν μπορούμε να ελέγξουμε γρήγορα αν ένα στοιχείο υπάρχει στην ουρά σε περίπτωση εισαγωγής του ίδιου στοιχείου ποιο θα κρατήσουμε; Το παλαιότερο ή το νεότερο; (Έχει σημασία όταν το κάθε στοιχείο συνοδεύεται και από άλλα δεδομένα)