Στοίβες Πληροφορικής 1
Περίληψη Ο Αφηρημένος Τύπος Δεδομένων (ΑΔΤ) : στοίβα Εφαρμογές στοίβας Υλοποίηση βασισμένη σε πίνακα Αυξανόμενη Στοίβα βασισμένη σε πίνακα Infix to Postfix Πληροφορικής 2
Αφηρημένος Τύπος Δεδομένων ΑΤΔ Abstract Data Types (ADTs) Ένας ΑΤΔ είναι μια αφαίρεση μιας δομής δεδομένων Ένας ΑΤΔ ορίζει: Αποθηκευμένα δεδομένα Λειτουργίες πάνω στα δεδομένα Συνθήκες λαθών σχετικές με τις λειτουργίες Παράδειγμα: ΑΤΔ μοντελοποίηση απλού χρηματιστηριακού συστήματος Τα δεδομένα είναι buy/sell εντολές Οι υποστηριζόμενες λειτουργίες είναι order buy(stock, shares, price) order sell(stock, shares, price) void cancel(order) Συνθήκες λαθών : Buy/sell μια μη υπάρχουσα μετοχή Ακύρωση μη υπάρχουσας εντολής Πληροφορικής 3
Η στοίβα ΑΤΔ O ΑΤΔ στοίβα αποθηκεύει αυθαίρετα αντικείμενα Οι εισαγωγές και διαγραφές ακολουθούν το last-in first-out μοντέλο Βασικές λειτουργίες της στοίβας: push(object o): εισάγει το στοιχείο o pop(): αφαιρεί και επιστρέφει το τελευταία εισηγμένο στοιχείο Βοηθητικές λειτουργίες της στοίβας: top(): επιστρέφει το τελευταία εισηγμένο στοιχείο χωρίς να το αφαιρεί size(): επιστρέφει τον αριθμό τον αποθηκευμένων στοιχείων isempty(): Boolean τιμή που δείχνει αν υπάρχουν αποθηκευμένα στοιχεία Πληροφορικής 4
Εξαιρέσεις (Exceptions) Η απόπειρα εκτέλεσης μιας λειτουργίας σε ADT μπορεί να προκαλέσει συνθήκες λαθών, που ονομάζονται exceptions Οι Exceptions λέγεται ότι γίνονται thrown από μια λειτουργία που δεν μπορεί να εκτελεστεί Στη στοίβα ΑΤΔ, οι λειτουργίες pop και top δεν μπορούν να εκτελεστούν αν η στοίβα είναι άδεια Η απόπειρα εκτέλεσης της pop ή top σε άδεια στοίβα προκαλεί την EmptyStackException Πληροφορικής 5
Εφαρμογές της Στοίβας Άμεσες εφαρμογές Ιστορικό σελίδων σε Web browser Ακολουθία undo σε επεξεργαστή κειμένου Έμμεσες εφαρμογές Βοηθητική δομή δεδομένων για αλγόριθμους Συστατικό άλλων δομών δεδομένων Πληροφορικής 6
C++ Run-time Στοίβα Το C++ run-time system καταγράφει την αλυσίδα των ενεργών συναρτήσεων στη στοίβα Όταν μια συνάρτηση καλείται, το runtime system σπρώχνει στη στοίβα ένα πλαίσιο που περιέχει Τοπικές μεταβλητές και τιμή επιστροφής Program counter, που καταγράφει την εντολή που εκτελείται Όταν μια συνάρτηση επιστρέφει, το πλαίσιό της αφαιρείται από τη στοίβα και ο έλεγχος περνάει στην μέθοδο στην κορυφή της στοίβας main() { int i 5; foo(i); } foo(int j) { int k; k j+1; bar(k); } bar(int m) { } bar PC 1 m 6 foo PC 3 j 5 k 6 main PC 2 i 5 Πληροφορικής 7
Στοίβα Βασισμένη σε Πίνακα Ένας απλός τρόπος για την υλοποίηση ADT στοίβας με χρήση πινάκων Προσθέτουμε στοιχεία από αριστερά προς τα δεξιά Μια μεταβλητή καταγράφει τον δείκτη του κορυφαίου στοιχείου Algorithm size() return t + 1 Algorithm pop() if isempty() then throw EmptyStackException else t t 1 return S[t + 1] S 0 1 2 t Πληροφορικής 8
Βασισμένη σε Πίνακα Στοίβα (συνέχεια) Ο πίνακας που περιέχει τα στοιχεία της στοίβας μπορεί να γεμίσει Μια push εντολή θα προκαλέσει τότε μια FullStackException Περιορισμός της υλοποίησης σε πίνακα Algorithm push(o) if t S.length 1 then throw FullStackException else t t + 1 S[t] o S 0 1 2 t Πληροφορικής 9
Απόδοση και Περιορισμοί Απόδοση Έστω n ο αριθμός των στοιχείων στη στοίβα Ο χώρος που χρησιμοποιείται είναι O(n) Κάθε λειτουργία εκτελείται σε χρόνο O(1) Περιορισμοί Το μέγιστο μέγεθος της στοίβας πρέπει να οριστεί a priori, και δεν μπορεί να αλλάξει Η απόπειρα εισαγωγής νέου στοιχείου σε γεμάτη στοίβα προκαλεί exception Πληροφορικής 10
Computing Spans Δείχνουμε πως χρησιμοποιείται μια στοίβα σαν βοηθητική δομή δεδομένων σε αλγόριθμο Δεδομένου πίνακα X, το span S[i] του X[i] είναι ο μέγιστος αριθμός συνεχών στοιχείων X[j] που προηγούνται άμεσα του X[i] και τέτοια ώστε X[j] X[i] Εφαρμογή σε οικονομική ανάλυση Π.χ., μετοχή σε 52-week high 7 6 5 4 3 2 1 0 X S 0 1 2 3 4 6 3 4 5 2 1 1 2 3 1 Πληροφορικής 11
Τετραγωνικός Αλγόριθμος (Quadratic) Algorithm spans1(x, n) Input array X of n integers Output array S of spans of X # S new array of n integers n for i 0 to n 1 do n s 1 n while s i X[i s] X[i] 1 2 (n 1) s s 1 1 2 (n 1) S[i] s n return S 1 Ο αλγόριθμος spans1 εκτελείται σε χρόνο O(n 2 ) Πληροφορικής 12
Υπολογισμός Spans με Στοίβα Κρατάμε στη στοίβα τους δείκτες των ορατών στοιχείων όταν «κοιτάμε πίσω» Σκανάρουμε τον πίνακα από αριστερά προς τα δεξιά Έστω i ο τρέχον δείκτης Αφαιρούμε δείκτες από την στοίβα μέχρι να βρούμε δείκτη j τέτοιο ώστε X[i] X[j] Θέτουμε S[i] i j Προσθέτουμε το x στην στοίβα 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 Πληροφορικής 13
Γραμμικός Αλγόριθμος Κάθε δείκτης του πίνακα Προστίθεται στην στοίβα ακριβώς μια φορά Αφαιρείται από την στοίβα το πολύ μια φορά Οι δηλώσεις στο whileloop εκτελούνται το πολύ n φορές Ο αλγόριθμος spans2 εκτελείται σε χρόνο O(n) Algorithm spans2(x, n) # S new array of n integers n A new empty stack 1 for i 0 to n 1 do n while ( A.isEmpty() X[top()] X[i] ) do n j A.pop() n if A.isEmpty() then n S[i] i 1 n else S[i] i j n A.push(i) n return S 1 Πληροφορικής 14
Επεκτεινόμενη Στοίβα Βασισμένη σε πίνακα Σε μια push λειτουργία, όταν ο πίνακας είναι γεμάτος, αντί για δημιουργία exception, μπορούμε να αντικαταστήσουμε τον πίνακα με έναν μεγαλύτερο Πόσο μεγάλος πρέπει να είναι ο νέος πίνακας; αυξητική στρατηγική: αύξηση μεγέθους με σταθερά c στρατηγική διπλασιασμού: διπλασιασμός του μεγέθους Algorithm push(o) if t S.length 1 then A new array of size for i 0 to t do A[i] S[i] S A t t + 1 S[t] o Πληροφορικής 15
Σύγκριση Στρατηγικών Συγκρίνουμε την αυξητική στρατηγική και την στρατηγική διπλασιασμού αναλύοντας τον συνολικό χρόνο T(n) που χρειάζεται για να εκτελεστεί μια σειρά από n λειτουργίες push Υποθέτουμε ότι ξεκινάμε με μια άδεια στοίβα που αναπαριστάται με πίνακα μεγέθους 1 Ονομάζουμε αποσβενούμενο χρόνο μίας push λειτουργίας τον μέσο χρόνο T(n)/n Πληροφορικής 16
Ανάλυση της Στρατηγικής Διπλασιασμού Αντικαθιστούμε τον πίνακα k log 2 n φορές Ο συνολικός χρόνος T(n) μιας σειράς από n push λειτουργίες είναι ανάλογος με n + 1 + 2 + 4 + 8 + + 2 k n 2 k + 1 1 2n 1 T(n) είναι O(n) Ο αποσβενούμενος χρόνος της push λειτουργίας είναι O(1) γεωμετρική σειρά 2 4 1 1 8 Πληροφορικής 17
Ανάλυση της Αυξητικής Στρατηγικής Αντικαθιστούμε τον πίνακα k n/c φορές Ο συνολικός χρόνος T(n) μιας σειράς από n push λειτουργίες είναι ανάλογος με n + c + 2c + 3c + 4c + + kc n + c(1 + 2 + 3 + + k) n + ck(k + 1)/2 Αφού το c είναι σταθερά, ο T(n) είναι O(n + k 2 ), π.χ., O(n 2 ) Ο αποσβενούμενος χρόνος της push λειτουργίας είναι O(n) Πληροφορικής 18
Λογιστική Ανάλυση της Στρατηγικής Διπλασιασμού Η λογιστική μέθοδος (accounting method) καθορίζει τον αποσβενούμενο τρέχοντα χρόνο με ένα σύστημα πιστώσεων και χρεώσεων Θεωρούμε τον υπολογιστή σαν μία coin-operated συσκευή που απαιτεί ένα 1 cyber-ευρώ για ένα σταθερό ποσό υπολογισμού. Δημιουργούμε ένα σχήμα για να χρεώνονται οι λειτουργίες, γνωστό ώς σχήμα απόσβεσης. Το σχήμα πρέπει να δίνει συνεχώς αρκετά λεφτά για να πληρώνουμε το κόστος της λειτουργίας. Το συνολικό κόστος μιας σειράς λειτουργιών δεν είναι μεγαλύτερο από το συνολικό ποσό που χρεώνεται. (χρόνος απόσβεσης) (σύνολο Ευρώ / (# λειτουργιών) Πληροφορικής 19
Σχήμα Απόσβεσης για την Στρατηγική Διπλασιασμού Θεωρούμε ξανά k φάσεις, όπου κάθε φάση αποτελείται από τα διπλάσια pushes από την προηγούμενη. Στο τέλος μιας φάσης πρέπει να έχουμε αρκετά για να πληρώσουμε για το push της επόμενης φάσης. Στο τέλος της φάσης i θέλουμε να έχουμε κρατήσει i cyber-ευρώ, για να πληρώσουμε για την αύξηση του πίνακα για το ξεκίνημα της επόμενης φάσης. $ $ $ $ $ $ $ $ $ $ 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 9 101112131415 Χρεώνουμε 3ευρώγια ένα push. Τα 2Ευρώπου κρατάμε για ένα κανονικό push φυλάσσονται στο δεύτερο μισό του πίνακα. Συνεπώς θα έχουμε 2(i/2)i cyber-ευρώ στο τέλος της φάσης i. Άρα, κάθε push τρέχει σε O(1) χρόνο απόσβεσης. Τα n pushes τρέχουν σε O(n) χρόνο. Πληροφορικής 20
Διεπαφή Στοίβας (Stack Interface) στη C++ Διεπαφή που αντιστοιχεί στην ADT Στοίβα Απαιτεί τον ορισμό της κλάσης EmptyStackException Παρόμοια κατασκευή είναι το άνυσμα (vector) template <typename Object> class Stack { public: int size(); bool isempty(); Object& top() throw(emptystackexception); void push(object o); Object pop() throw(emptystackexception); }; Πληροφορικής 21
Στοίβα βασισμένη σε Πίνακα στη C++ template <typename Object> class ArrayStack { private: int capacity; // stack capacity Object *S; // stack array int top; // top of stack public: ArrayStack(int c) { capacity c; S new Object[capacity]; t 1; } bool isempty() { return (t < 0); } Object pop() throw(emptystackexception) { if(isempty()) throw EmptyStackException ( Access to empty stack ); return S[t--]; } // (other functions omitted) Πληροφορικής 22
Στοίβα (stack)- Συνοπτικά Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή πρώτη εξαγωγή) Περιορισμένος τύπος γραμμικής λίστας: Εισαγωγή και διαγραφή μόνο στο ένα άκρο της λίστας (στην αρχή) AbstractDataType Stack { instances ordered list of elements; one end is called the bottom; the other is the top; operations Create (): create an empty stack; IsEmpty (): return true if stack is empty, return false otherwise; Top (): return top element of stack; Add (x): add element x to the stack; Delete (x): delete top element from stack and put it in x; } Πληροφορικής 23
Εφαρμογή Στοίβας Υπολογισμός της ΕΠΙΘΕΜΑΤΙΚΗΣ μορφής μίας αλγεβρικής έκφρασης από την ΕΝΔΟΘΕΜΑΤΙΚΗ μορφή. ΕΠΙΘΕΜΑΤΙΚΗ POSTFIX ΕΝΔΟΘΕΜΑΤΙΚΗ INFIX Στην ενδοθεματική μορφή αναπαράστασης αλγεβρικών εκφράσεων ο μοναδικός τελεστής τίθεται πριν από τη μεταβλητή ενώ ο δυαδικός τελεστής τίθεται μεταξύ των δύο μεταβλητών. Πληροφορικής 24
Εφαρμογή Στοίβας Παράδειγμα: Ενδοθεματική (Infix): A*B+C*D^E/F+G*H Επιθεματική (Postfix): AB*CDE^*F/+GH*+ Για τον υπολογισμό μιας αλγεβρικής έκφρασης ο μεταφραστής πραγματοποιεί: Μετάφραση της ενδοθεματικής μορφής της αριθμητικής έκφρασης σε επιθεματική Η επιθεματική μορφή χρησιμοποιείται για τον υπολογισμό της αλγεβρικής έκφρασης Πληροφορικής 25
Προτεραιότητες Τελεστών Οι μαθηματικές εκφράσεις αποτελούνται από τελεστές (operators) και από μεταβλητές ή τελεστέους (operands). Οι τελεστές διακρίνονται σε δυαδικούς (binary) και σε Operator unary-, unary+,! *, /, %, && +, -, <, >,,!, <, > Priority 4 3 2 1 μοναδικούς (unary) αν αφορούν δύο ή μια μεταβλητές αντίστοιχα Πληροφορικής 26
infix expression: z a * ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: Όταν ένα στοιχείο είναι μεταβλητή ή σταθερά, τότε τοποθετείται στα δεξιά της επιθεματικής μορφής Όταν το στοιχείο είναι τελεστής τότε κατευθύνεται σε μια στοίβα. Πριν την οριστική ώθηση στη στοίβα, ο τελεστής συγκρίνεται με τον τελεστή της κορυφής της στοίβας. Όταν εισερχόμενος τελεστής έχει προτεραιότητα μεγαλύτερη, τότε ο τελεστής εισάγεται στην κορυφή της στοίβας Εάν η προτεραιότητα του εισερχόμενου τελεστή είναι μικρότερη ή ίση τότε: Απωθούνται όλοι οι τελεστές της στοίβας με προτεραιότητα μεγαλύτερη ή ίση από την προτεραιότητα του νέου τελεστή Και ο νέος τελεστής εισάγεται και η ώθηση ολοκληρώνεται Πληροφορικής 27
infix expression: z a * ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: Πληροφορικής 28
infix expression: z a * ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z Πληροφορικής 29
infix expression: za * ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z Πληροφορικής 30
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a Πληροφορικής 31
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a * Πληροφορικής 32
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a ( * Πληροφορικής 33
infix expression: za* (x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x ( * Πληροφορικής 34
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x + ( * Πληροφορικής 35
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + ( * Πληροφορικής 36
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + ( * Πληροφορικής 37
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * Πληροφορικής 38
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * Πληροφορικής 39
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * + Πληροφορικής 40
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z + Πληροφορικής 41
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z * + Πληροφορικής 42
infix expression: za* ( x + y ) + z * c ^ ( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c * + Πληροφορικής 43
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c ^ * + Πληροφορικής 44
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c ( ^ * + Πληροφορικής 45
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c 2 ( ^ * + Πληροφορικής 46
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c 2 ( ^ * + Πληροφορικής 47
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c 2 ( ( ^ * + Πληροφορικής 48
infix expression: za* ( x + y ) + z * c^( 2 ( d + w ) ) / x ; postfix expression: z a x y + * z c 2 ~ ( ( ^ * + Πληροφορικής 49
infix expression: za* ( x + y ) + z * c^( 2 ( d+ w ) ) / x ; postfix expression: z a x y + * z c 2 d ~ ( ( ^ * + Πληροφορικής 50
infix expression: za* ( x + y ) + z * c^( 2 ( d+w ) ) / x ; postfix expression: z a x y + * z c 2 d ~ ( ( ^ * + Πληροφορικής 51
infix expression: za* ( x + y ) + z * c^( 2 ( d+w ) ) / x ; postfix expression: z a x y + * z c 2 d ~ ( ( ^ * + Πληροφορικής 52
infix expression: za* ( x + y ) + z * c^( 2 ( d+w ) ) / x ; postfix expression: z a x y + * z c 2 d ~ + ( ( ^ * + Πληροφορικής 53
infix expression: za* ( x + y ) + z * c^( 2 ( d+w) ) / x ; postfix expression: z a x y + * z c 2 d ~ w + ( ( ^ * + Πληροφορικής 54
infix expression: za* ( x + y ) + z * c^( 2 ( d+w)) / x ; postfix expression: z a x y + * z c 2 d ~ w + ( ( ^ * + Πληροφορικής 55
infix expression: za* ( x + y ) + z * c^( 2 ( d+w)) / x ; postfix expression: z a x y + * z c 2 d ~ w + ( ( ^ * + Πληροφορικής 56
infix expression: za* ( x + y ) + z * c^( 2 ( d+w)) / x ; postfix expression: z a x y + * z c 2 d ~ w + ( ( ^ * + Πληροφορικής 57
infix expression: za* ( x + y ) + z * c^( 2 ( d+w)) / x ; postfix expression: z a x y + * z c 2 d ~ w + ( ^ * + Πληροφορικής 58
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/ x ; postfix expression: z a x y + * z c 2 d ~ w + ( ^ * + Πληροφορικής 59
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/ x ; postfix expression: z a x y + * z c 2 d ~ w + ( ^ * + Πληροφορικής 60
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/ x ; postfix expression: z a x y + * z c 2 d ~ w + ^ * + Πληροφορικής 61
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x ; postfix expression: z a x y + * z c 2 d ~ w + ^ * + Πληροφορικής 62
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x ; postfix expression: z a x y + * z c 2 d ~ w + ^ * + Πληροφορικής 63
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x ; postfix expression: z a x y + * z c 2 d ~ w + ^ * + Πληροφορικής 64
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x ; postfix expression: z a x y + * z c 2 d ~ w + ^ * / + Πληροφορικής 65
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 66
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 67
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 68
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 69
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 70
infix expression: za* ( x + y ) + z * c^( 2 ( d+w))/x; postfix expression: z a x y + * z c 2 d ~ w + ^ * x / + Πληροφορικής 71
Εφαρμογή Στοίβας Αναζήτηση ενός μονοπατιού σε ένα λαβύρινθο. Πληροφορικής 72
Λαβύρινθος Entrance Exit Πληροφορικής 73
1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 Πληροφορικής 74
Κινήσεις NW N NE [row-1][col-1] [row-1]col] [row-1][col+1] W X E [row]col-1] [row][col] [row][col+1] [row+1][col-1] [row+1][col] [row+1][col+1] SW S SE Allowable moves Πληροφορικής 75
Επίλυση Είσοδος 1 1 1 1 1 1 0 0 1 0 0 1 (1,4,E) (1,3,E) 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 Έξοδος (2,3,N) (2,2,E) (2,1,E) (1,1,S) (1,0,E) Πληροφορικής 76
Παράδειγμα Να προτείνετε µια δοµή δεδοµένων η οποία να υποστηρίζει εκτός από τις συνήθεις πράξεις στοίβας (IsEmpty, MakeEmpty, Top, Push, Pop) και την επιπλέον πράξη FindMin, η οποία επιστρέφει το µικρότερο στοιχείο της δοµής (χωρίς να το εξάγει). Να γράψετε ι) µια καθαρή προδιαγραφή των πράξεων και των µεταβλητών που χρειάζονται για τη δοµή και (ιι) την υλοποίηση των πράξεων σε ψευδοκώδικα. Όλες οι πράξεις πρέπει να είναι της τάξης Ο(1). Πληροφορικής 77
Λύση Σε κάθε θέση της στοίβας αποθηκεύουµε ζεύγη στοιχείων όπου το πρώτο µέλος κάθε ζεύγους αντιστοιχεί στο στοιχείο που εισήχθηκε, και το δεύτερο µέλος του ζεύγους στο µέχρι στιγµής ελάχιστο στοιχείο της στοίβας. Πληροφορικής 78
Για παράδειγµα οι διαδοχικές εισαγωγές 4,3,5,9,7,1,2 έχουν ως αποτέλεσµα τις πιο κάτω Κατά συνέπεια, ανά πάσα στιγµή µπορούµε να βρούµε και να επιστρέψουµε το ελάχιστο στοιχείο της στοίβας σε χρόνο σταθερό (επιστρέφοντας το δεύτερο µέλος του ζεύγους που βρίσκεται στον κόµβο κορυφής της στοίβας). Πληροφορικής 79