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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αφηρηµένοι Τύποι Δεδοµένων Κεφάλαιο 4 ( , ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

Στοιχειώδεις Δομές Δεδομένων

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

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

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

Προγραμματισμός Υπολογιστών με C++

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

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

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

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

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

Κατηγορίες Συμπίεσης. Συμπίεση με απώλειες δεδομένων (lossy compression) π.χ. συμπίεση εικόνας και ήχου

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

Διδάσκων: Παναγιώτης Ανδρέου

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

Λίστες παράλειψης (skip lists)

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

4. Συνδεδεμένες Λίστες

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

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

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

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

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

POINTERS, AGGREGATION, COMPOSITION

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

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

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

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

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

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

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

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Βασικές Δοµές Δεδοµένων. Σύντοµη επανάληψη (ΕΠΛ 035).

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

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

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

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

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

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Κεφάλαιο 6 Ουρές Προτεραιότητας

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

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

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

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Στοίβες Ουρές - Λίστες

public class ArrayStack implements Stack {

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

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

IsEmptyList(L): επιστρέφει true αν L = < >, false

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

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

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

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

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

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

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Υλοποίηση Λειτουργιών Στοίβας Απλά(1/2)

Transcript:

Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (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(); // απώθηση αντικειμένου }

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

Υλοποίηση με πίνακα stack pointer Ν : δείχνει την επόμενη κενή θέση α β γ δ κάτω όριο 0 class Stack { private Item[] S; private int N; τρέχουσα κορυφή άνω όριο maxn-1 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]; }

Υλοποίηση με πίνακα stack pointer Ν : δείχνει την επόμενη κενή θέση α β γ δ κάτω όριο 0 class Stack { private Item[] S; private int N; τρέχουσα κορυφή άνω όριο maxn-1 } 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; } Χρειάζεται όταν ο πίνακας S αποθηκεύει αναφορές σε αντικείμενα, έτσι ώστε το σύστημα της Java να γνωρίζει ότι η αντίστοιχη μνήμη μπορεί να απελευθερωθεί.

Υλοποίηση με πίνακα stack pointer Ν : δείχνει την επόμενη κενή θέση Τι γίνεται όμως αν Ν == maxn ; α β γ δ κάτω όριο 0 class Stack { private Item[] S; private int N; τρέχουσα κορυφή άνω όριο maxn-1 } 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; } Χρειάζεται όταν ο πίνακας S αποθηκεύει αναφορές σε αντικείμενα, έτσι ώστε το σύστημα της Java να γνωρίζει ότι η αντίστοιχη μνήμη μπορεί να απελευθερωθεί.

Υλοποίηση με συνδεδεμένη λίστα head δ γ β α τρέχουσα κορυφή 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; }

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

ενθεματική αναπαράσταση μεταθεματική αναπαράσταση

μεταθεματική αναπαράσταση ενθεματική αναπαράσταση Αντικαθιστούμε με όπου δυαδικός τελεστής

μεταθεματική αναπαράσταση ενθεματική αναπαράσταση Αντικαθιστούμε με όπου δυαδικός τελεστής

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

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

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

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

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

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

Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής, εκτελούμε 6 x = S.pop(); y = S.pop(); z = x y; S.push(z); 4 17 5 στοίβα S

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

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

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

Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S Αν το επόμενο σύμβολο είναι αριθμός x τότε εκτελούμε S.push(x) Διαφορετικά, αν είναι τελεστής, εκτελούμε x = S.pop(); y = S.pop(); z = x y; S.push(z); 7+408=415 415 5 στοίβα S

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

Υπολογισμός μεταθεματικής αναπαράστασης με στοίβα S (τύπου int) 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. Αν το επόμενο σύμβολο είναι: - αριθμός : τον τυπώνουμε - ( : δεν κάνουμε τίποτα - ) : εκτελούμε S.pop() και τυπώνουμε το σύμβολο που λάβαμε - τελεστής : εκτελούμε S.push() στοίβα S

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ενθεματική αναπαράσταση μεταθεματική αναπαράσταση 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 (First In First Out) ουρά : η διαγραφή απομακρύνει το παλαιότερο στοιχείο της ουράς τοποθέτηση(q,x) : τοποθετεί το στοιχείο x στo τέλος της ουράς Q λήψη(q) : επιστρέφει το στοιχείο x που βρίσκεται στην αρχή της ουράς Q και διαγράφει το x από την Q λήψη τοποθέτηση FIFO ουρά

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

FIFO Ουρά Υλοποίηση με συνδεδεμένη λίστα head δ γ β α tail 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; }

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

FIFO Ουρά Υλοποίηση με πίνακα tail head % N Ν-1 0 class Queue { private Item[] q; 1 private int N, head, tail; Queue(int maxn) { q = new Item[maxN + 1]; 5 4 3 2 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 7 0 6 5 1 2 4 3 tail : δείχνει την επόμενη κενή θέση του πίνακα στην οποία θα τοποθετηθεί νέο στοιχείο head : δείχνει τη θέση του παλαιότερου στοιχείου της ουράς

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

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

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

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

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

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

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

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

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

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

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