Άσκηση με στοίβες

Ξεκίνησε από akalest0s, 13 Ιουν 2020, 02:17:49 ΜΜ

« προηγούμενο - επόμενο »

Ποια η γνώμη σας για την άσκηση;

Τι κάπνιζες όταν την έγραφες; (Πολύπλοκη χωρίς λόγο)
2 (50%)
Πόσο έγραφες Έκφραση-Έκθεση είπαμε; (Δυσνόητη/ασαφής εκφώνηση)
0 (0%)
Έχεις ξαναδιδάξει Γ Λυκείου; (Ακατάλληλη για παιδιά Γ Λυκείου - ΑΕΠΠ)
0 (0%)
Ευτυχώς δεν βάζεις εσύ θέματα μεθαύριο! (Ακατάλληλη για Δ θέμα Πανελληνίων)
0 (0%)
Πέρνα ξανά Δευτέρα απ' το γραφείο μου.. (Θέλει δουλειά ακόμη)
0 (0%)
Τρώγεται..
2 (50%)

Σύνολο ψηφοφόρων: 4

akalest0s

Καλησπέρα.. μια άσκηση που σκέφτομαι να κάνω σε ένα από τα τελευταία μαθήματα με τα παιδιά φέτος, πριν τις εξετάσεις. Παραθέτω ενδεικτική λύση και.. ακούω γνώμες.
Η άσκηση διαχειρίζεται δύο στοίβες, αλλά για να κάνω την εκφώνηση λίγο πιο δύσκολη, δεν το αναφέρω πουθενά ρητά. Αναρωτιέμαι αν έτσι την κάνω πολύ.. trivial.  :-\
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

epsilonXi

εμένα μ' αρέσει

σε κάποιον καλό μαθητή θα πρότεινα επιπλέον, στην περίπτωση που το back είναι γεμάτο και θελήσει ο χρήστης να επισκεφθεί νέα σελίδα, αντί για υπερχείλιση να έχουμε «λησμόνηση»

νέος όρος, μόλις επινοήθηκε

η στοίβα να ξεχνάει την παλιότερη εγγραφή από τις 20, ώστε να θυμάται τις 20 πιο πρόσφατες...

και την «λησμόνηση» να μην την κάνουν με κάποια μετακύλιση των δεδομένων στον «πίνακα», αφού δεν είναι πίνακας αλλά στοίβα, αλλά μέσω μίας τρίτης στοίβας...

akalest0s

Το σκέφτηκα, αλλά είπα να μην το τραβήξω τόσο πολύ και φύγουν ντομάτες!  ;D
Ίσως μπορεί να μπει σαν εξεζητημένο ερώτημα που θα λύσεις στην τάξη ή θα το θέσεις σε κάποιον πολύ καλό μαθητή, όπως είπες.
Ευχαριστώ.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

Σάκης Δημόπουλος


akalest0s

Ωραίο το βίντεο Σάκη. Επειδή κάποιος μου είπε ότι έχω λάθος χειρισμό στις στοίβες στην λύση μου, λάθος που δεν βλέπω, αν κάποιος μπορεί να επιβεβαιώσει..
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

gthal

Παράθεση από: akalest0s στις 16 Ιουν 2020, 08:47:47 ΜΜ
Επειδή κάποιος μου είπε ότι έχω λάθος χειρισμό στις στοίβες στην λύση μου, λάθος που δεν βλέπω, αν κάποιος μπορεί να επιβεβαιώσει..
@akalest0s ,
έχω την εντύπωση ότι η υλοποίηση της pop είναι που ξεφεύγει από αυτό που προσωπικά (και ίσως και όσοι σου είπαν για λάθος) θα ήθελα να καταλάβει ο μαθητής για την pop.
Τι εννοώ:
1) όπως η push έχει το έργο να "βάλει" κάτι μέσα στη στοίβα, έτσι και η pop έχει το έργο να "λάβει" κάτι από τη στοίβα και όχι απλά να το διαγράψει (πολύ δε περισσότερο, όχι να διαγράψει ένα πλήθος στοιχείων).
2) Επιπλέον, δες ας πούμε τι κάνεις με την εντολή ΚΑΛΕΣΕ push(ΣΤδ,τοπδ,ΣΤκ[τοπκ]) :
προσπελαύνεις άμεσα στο ΣΤκ[τοπκ] ως ένα οποιοδήποτε κελί του πίνακα, αντί να το "ζητήσεις" και να το "λάβεις" με μία pop.
Η pop θα σου έδινε πάντα το στοιχείο της κορυφής, ενώ με άμεση προσπέλαση θα μπορούσες ας πούμε να πάρεις και το ΣΤκ[τοπκ-2], πράγμα που καταστρατηγεί την ιδιότητά της ως στοίβας.
Ελπίζω να γίνεται κατανοητή η εξήγηση μου.

3) Τέλος όσον αφορά την ιδέα της άσκησης, δεν κατάλαβα γιατί ακριβώς πρέπει να υλοποιηθεί με 2 στοίβες όπου "πηγαινοφέρνουμε" στοιχεία από τη μία στην άλλη, ενώ μπορεί πολύ απλά να υλοποιηθεί με μία στοίβα;
Φιλικά,
Γιώργος Θαλασσινός

akalest0s

1)  Τι εννοείς "να το λάβει, να το διαγράψει"; Η πράξη είναι η ίδια ακριβώς με του βιβλίου, η top <- top - 1. Το αν θα το πεις "διαγραψει" εννοιολογικά, ή "λάβει" ή οτιδήποτε, τι σημασία έχει; Σημασία νομίζω έχει ότι με top<-top-1, βγάζω κάτι από την στοίβα.
Όσο για το πλήθος στοιχείων, το μόνο που αλλάζω είναι να επαναλαμβάνω την ίδια, ολόκληρη την λειτουργία της απώθησης, όσες φορές θέλω κάθε φορά. Αν αυτό φαίνεται κακό για την γενικότητα του interface, τότε μπορείς πολύ απλά να το συμπεριλάβεις πάνω στην κλήση της pop, και όχι εντός της διαδικασίας. Νομίζω δεν είναι σημαντική αλλοίωση, αλλά το δέχομαι. Το άλλο που προανέφερα, δεν το καταλαβαίνω ως πρόβλημα, όπως το λες.

2) Η υπόδειξή σου, μου γεννά το ερώτημα: στις στοίβες/ουρές, ΜΟΝΟ pop και push επιτρέπεται; Δεν επιτρέπεται η αναφορά/προσπέλαση στο πάνω πάνω στοιχείο; Γιατί; Με όσα ξέρω από προγραμματισμό, αλλά και με όσα λέει το βιβλίο ("push και pop οι βασικές λειτουργίες", ποιες είναι οι υπόλοιπες άραγε;), το να προσπελάσεις ΜΟΝΟ την κορυφή της στοίβας, είναι perfectly fine, έγκυρη λειτουργία. Δεν πήγα κάτω από την τοπ. Πουθενά. Οπότε που είναι το θέμα και εδώ; Θα συμφωνούσα αν έκανα προσπέλαση σε οποιοδήποτε άλλο στοιχείο, αυθαίρετα. Αλλά ακόμη και το τοπ στοιχείο, απαγορεύεται να το εμφανίσουμε/προσπελάσουμε;
Παράθεσηενώ με άμεση προσπέλαση θα μπορούσες ας πούμε να πάρεις και το ΣΤκ[τοπκ-2]
Αυτό λέω, ότι δεν έκανα κάτι τέτοιο. Αυτό θα ήταν όντως λάθος. Όμως η τοπκ που χρησιμοποιώ εκεί, επιτρέπω πιο πριν να αλλάξει μόνο μέσα από pop και push, όχι με άλλον τρόπο.

3) Αυτό που λες εδώ, ίσως έχει να κάνει με το "λάβει"/"διαγράψει" που λέγαμε πιο πάνω. Πως, χωρίς 2 στοίβες, θα πάρεις πάλι πίσω τα στοιχεία που έβγαλες (με pop) από την στοίβα, όταν έκανες πίσω στον browser? Αφού εκείνες οι σελίδες υποτίθεται χάθηκαν από την στοίβα, κάνοντας πίσω, δηλαδή pop.
Δεν χρειάζεσαι κάποια βοηθητική δομή εκεί;

Ευχαριστώ πολύ για το χρόνο σου και περιμένω τις απαντήσεις σου!
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

evry

Παράθεση από: akalest0s στις 21 Ιουν 2020, 12:39:03 ΜΜ
2) Η υπόδειξή σου, μου γεννά το ερώτημα: στις στοίβες/ουρές, ΜΟΝΟ pop και push επιτρέπεται;
Ακριβώς μόνο αυτό και τίποτα άλλο.

Παράθεση
Δεν επιτρέπεται η αναφορά/προσπέλαση στο πάνω πάνω στοιχείο; Γιατί;
Αν θες να δεις μέσα στη στοίβα πρέπει να κάνεις απώθηση, δεν μπορείς να δεις χωρίς απώθηση. Αυτό είναι το interface αυτού του Αφηρημένου Τύπου Δεδομένων

Ωστόσο σε κάποιες υλοποιήσεις/Interface αυτό που λες επιτρέπεται, π.χ. δες εδώ:
https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
που λέει:
Additionally, a peek operation may give access to the top without modifying the stack
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

akalest0s

Καταλαβαίνεις ότι γράφεις δύο αντίθετα πράγματα; "Ακριβώς μόνο αυτό και τίποτα άλλο"... αλλά τελικά, και κάτι άλλο, το peek!
Τόσο στον προγραμματισμό γενικότερα, όσο και στα πλαίσια του μαθήματος, το peek, είναι οκ, γιατί απλά βολεύει, χωρίς να χαλάει το interface μας.

Επίσης, τότε θέλω μια εξήγηση για εκείνο το σημείο που λέει "ΚΥΡΙΕΣ λειτουργίες".. γιατί δεν λέει ΜΟΝΑΔΙΚΕΣ να είμαστε ξεκάθαροι;
Προφανώς εγώ δεν έχω κανένα πρόβλημα να συμμορφωθώ με ΜΟΝΟ τις 2 αυτές λειτουργίες, πρόβλημα έχω με το ότι αυτά θα πρέπει να είναι ξεκάθαρα στο βιβλίο, να ξέρουμε και εμείς τελικά τι πρέπει να διδάσκουμε... Κάπου έχει καταντήσει αηδία το θέμα..

Ερώτηση: αν στις πανελλήνιες δείτε λύση σε άσκηση στοίβας με αναφορά στην κορυφή της στοίβας έξω από τις 2 "βασικές" λειτουργίες, θα κόβατε μονάδες; Θετική επιστήμη είπαμε....; ούτε για μπακάλικο δεν κάνουμε παιδιά!
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

evry

Δεν το διατύπωσα καλά ίσως.
Είπα ότι σε κάποιες περιπτώσεις επιτρέπεται ένα Peek για να δεις τι έχει πάνω ίσως γιατί αυτό είναι βολικό (αλλιώς θα έπρεπε να κάνεις pop+push) για συγκεκριμένες εφαρμογές.
Ωστόσο στις περισσότερες περιπτώσεις οι λειτουργίες σε μια στοίβα είναι τρεις:
1) push
2) pop
3) isEmpty
Αυτό είναι το πιο συνηθισμένο και πιο κοντά στον ορισμό της στοίβας.
Αν θέλεις μια δομή στην οποία χρειάζεται να κοιτάς το πάνω-πάνω ή άλλα στοιχεία τότε μάλλον δεν ήθελες στοίβα εξαρχής.
Ωστόσο όλα αυτά λύνονται αφού μια άσκηση μπορεί κάλλιστα να δώσει συγκεκριμένο Interface και να ζητήσει συγκεκριμένη υλοποίηση.
Το  πρόβλημα είναι ότι η χρήση στοίβας/ουράς στη ΓΛΩΣΣΑ είναι αντιπαιδαγωγική και αντιεπιστημονική διότι
1) Δεν υπάρχει διαχωρισμός interface / υλοποίησης, δηλαδή δεν έχουμε information hiding
2) Έτσι όπως παρουσιάζεται δεν μπορεί να κατανοήσει ο μαθητής τι χρειαζόμαστε τη στοίβα και όλη αυτή την πολυπλοκότητα αφού μπορεί να κάνει τα ίδια και με λιγότερο κώδικα με ένα array.

Έτσι όπως είναι το μάθημα θα έλεγα ότι μπορείς να έχεις peek σε μια στοίβα μόνο αν στο επιτρέπει η εκφώνηση, αλλιώς πρέπει να μείνεις σε push/pop.

Πάντως δεν καταλαβαίνω γιατί πρέπει να χρησιμοποιήσουμε το peek και να αναρωτιόμαστε αν θα το πάρουν σωστό και να μην χρησιμοποιήσουμε αλληλουχία pop+push = peek που είναι το ίδιο.

ΥΓ. Αυτή τη στιγμή το μάθημα έχει ξεπεράσει τις δυνατότητες της ΓΛΩΣΣΑΣ, για αυτό δημιουργούνται όλα αυτά τα προβλήματα. Να δω πότε θα το καταλάβουμε επιτέλους.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

akalest0s

Οκ,.. το μυαλό μου τώρα μπαίνει λίγο πίσω στη θέση του  :D
Το ότι το μάθημα έχει ξεπεράσει τις δυνατότητες της Γλώσσας, συμφωνώ και επαυξάνω, τα έχουμε πει και στο θέμα με την python..
ΠαράθεσηΠάντως δεν καταλαβαίνω γιατί πρέπει να χρησιμοποιήσουμε το peek και να αναρωτιόμαστε αν θα το πάρουν σωστό και να μην χρησιμοποιήσουμε αλληλουχία pop+push = peek που είναι το ίδιο.
Όπως πολύ σωστά είπες, τα παιδιά δεν καταλαβαίνουν την όλη τη λογική μιας adt, ειδικά με τον ανεπαρκή τρόπο που παρουσιάζεται στο βιβλίο/Γλωσσα.
Πόσο μάλλον να κάνουν κάτι τέτοιο που λες, αντί για την απλούστατη και ήδη γνωστή αναφορά ΣΤ[τοπ], έξω από pop και push.
Όμως ίσως αξίζει τον κόπο να τους το δείξω.. ομολογώ πως μέχρι τώρα θεωρούσα τελείως φυσικό ένα απλό peek και τέλος.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

gthal

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

με δεύτερη σκέψη, ίσως έχεις δίκιο για το 3ο ζήτημα που έθεσα. Γιατί με μία στοίβα μάλλον κι εγώ θα πρέπει να παραβιάσω λίγο την κλασική λειτουργία της στοίβας.
θα κάνω μια προσπάθεια μόλις ευκαιρήσω πάντως.
Φιλικά,
Γιώργος Θαλασσινός

akalest0s

Σας ευχαριστώ πολύ και τους δύο για το χρόνο σας, όπως και να έχει. Κέρδος είχα.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

Νίκος Αδαμόπουλος

Πάντως και στο Stl υπάρχει το top() που σου επιστρέφει το στοιχείο της κορυφής χωρίς να το αφαιρέσει από τη στοίβα.

ApoAntonis

Την παρακάτω απάντηση την έγραψα την Δευτέρα το βράδυ, την κράτησα για τον εαυτό μου λόγω των ημερών μην τύχει και την "προσπελάσει" κανείς υποψήφιος και του γεννηθούν αχρείαστα ερωτηματικά.


Το συμπληρωματικό υλικό αναφέρει στα πλεονεκτήματα, μειονεκτήματα λιστών και πινάκων, ότι η τυχαία πρόσβαση στις λίστες δεν επιτρέπεται. Πρώτο σημείο: Τι να υποθέσουμε για τις στοίβες και τις ουρές;
Δεύτερο σημείο: Ποιά είναι - και που ειπώθηκε- η συνθήκη κατά την οποία ότι η τυχαία προσπέλαση σε πίνακα δεν επιτρέπεται.

Παράθεση από: akalest0s στις 21 Ιουν 2020, 12:39:03 ΜΜ

2) Η υπόδειξή σου, μου γεννά το ερώτημα: στις στοίβες/ουρές, ΜΟΝΟ pop και push επιτρέπεται; Δεν επιτρέπεται η αναφορά/προσπέλαση στο πάνω πάνω στοιχείο; Γιατί; Με όσα ξέρω από προγραμματισμό, αλλά και με όσα λέει το βιβλίο ("push και pop οι βασικές λειτουργίες", ποιες είναι οι υπόλοιπες άραγε;), το να προσπελάσεις ΜΟΝΟ την κορυφή της στοίβας, είναι perfectly fine, έγκυρη λειτουργία. Δεν πήγα κάτω από την τοπ. Πουθενά. Οπότε που είναι το θέμα και εδώ; Θα συμφωνούσα αν έκανα προσπέλαση σε οποιοδήποτε άλλο στοιχείο, αυθαίρετα. Αλλά ακόμη και το τοπ στοιχείο, απαγορεύεται να το εμφανίσουμε/προσπελάσουμε;Αυτό λέω, ότι δεν έκανα κάτι τέτοιο. Αυτό θα ήταν όντως λάθος. Όμως η τοπκ που χρησιμοποιώ εκεί, επιτρέπω πιο πριν να αλλάξει μόνο μέσα από pop και push, όχι με άλλον τρόπο.


Παράθεση από: evry στις 21 Ιουν 2020, 01:00:21 ΜΜ
Ακριβώς μόνο αυτό και τίποτα άλλο.

Τα παραδείγματα που υπάρχουν στο βιβλίο 2, δεν ακολουθούν αυτόν τον περιορισμό. Δεν αναφέρομαι καν στις λύσεις οι οποίες δεν έχουν διανεμηθεί.

"κατά την εξαγωγή ... χωρίς να γίνεται καμία παρέμβαση στα περιεχόμενα του πίνακα" (σελίδα 24) και αμέσως μετά στο παράδειγμα 1
ενώ σαφώς δείχνει υλοποίηση ουράς με πίνακα, στην εξαγωγή διαγράφει τα στοιχεία.
Μάλιστα στο δεύτερο ερώτημα "ώστε η έξοδος να εμφανίζει τα στοιχεία Τ,Ε,Λ,Ο,Σ"
Που γίνεται έξοδος; Είναι λειτουργία, είναι εντολή, είναι από το διάστημα;

Αντίστοιχα, προβλήματα για τις στοίβες φυσικά.
"η βοηθητική μεταβλητή top δείχνει το στοιχείο που τοποθετήθηκε τελευταίο στην κορυφή της στοίβας"
στην ίδια σελίδα (!)
"η μεταβλητή top είναι η μεταβλητή που δείχνει τη θέση που τοποθετήθηκε ... δηλαδή δείχνει την κορυφή της στοίβας"

Απελπισία με πιάνει. Δεν μπορούμε να πάρουμε μια απόφαση αν η μεταβλητή δείχνει το στοιχείο ή την θέση του.

Ο αποκλεισμός άλλος λειτουργιών είναι αυθαίρετος. Ακόμα και η προσπέλαση τυχαίου στοιχείου.
Με ποιά λογική θα γίνει διόρθωση (στο απευκταίο σενάριο όπου θα ζητηθεί κάτι τέτοιο) όταν θα εμφανιστεί σε γραπτό. Επομένως με ποιές προϋποθέσεις θα παρθεί απόφαση αν αυτό που έχει δοθεί ως απάντηση, είναι σκέψη του εξεταζόμενου ή προέρχεται από την διδασκαλία;

Ελπίζω να μην περιέλθουμε σε κατάσταση κλαυσίγελου μεθαύριο.

akalest0s

Αντώνη, νομίζω έχουμε ξανασυμφωνήσει ότι η κατάσταση που σωστά περιγράφεις, είναι όντως απελπισία και χρήζει άμεσης αλλαγής.
Πάντως εδώ με μπέρδεψες: παραθέτεις την απόλυτη απάντηση του Ευρυπίδη πιο πάνω, και μετά λες
"Ο αποκλεισμός άλλος λειτουργιών είναι αυθαίρετος. Ακόμα και η προσπέλαση τυχαίου στοιχείου."

Εγώ πάντως στην εκφώνηση θα βάλω μια σχετική υποσημείωση, όπως ειπώθηκε, ότι η προσπέλαση μόνο του τοπ στοιχείου, επιτρέπεται για την λύση της άσκησης.
Ήταν ευτύχημα φυσικά, ότι ασκήσεις ΘέμαΓ/Δ, με κώδικα σε στοίβες/ουρές, δεν είδαμε στις εξετάσεις. Επειδή όμως τους είχα ικανούς, έπρεπε να προετοιμάσω κατάλληλα, κατά το δυνατόν, τους μαθητές. Για αυτό και η εν λόγω άσκηση.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

ApoAntonis

Δεν δείχνω προσπελάσεις στο όπου να'ναι. Προφανώς. Όμως δεν το βλέπω και πουθενά γραμμένο. Είναι υλοποίηση, είναι "φρέσκο" υλικό, θα έπρεπε να έχει προσεχθεί.

Το κύριες λειτουργίες δεν μπορεί να σημαίνει αποκλειστικές όπως έγραψες.

Παρένθεση: Το βιβλίο του Προγραμματισμού ΕΠΑΛ, αναφέρει κύριες λειτουργίες που πρέπει να υποστηρίζει η υλοποίηση μιας στοίβας.
Εντελώς διαφορετική διατύπωση, αφού διαχωρίζει την περίπτωση της υλοποίησης. Συνεχίζει με το τι επιτρέπεται στην διεπαφή. Δεν σε αφήνει να νομίζεις ότι θες. Ο Evry το έχει ξεκαθαρίσει και με άλλες τοποθετήσεις ότι "άλλο πράγμα ρε παιδάκι μου η υλοποίηση". (σε κάπως ελεύθερη απόδοση :) )
Δεν καταλαβαίνω όμως από που προκύπτει -και εννοώ μέσα από το βιβλίο- ότι στην περίπτωση της υλοποίησης με πίνακα στην ΓΛΩΣΣΑ, απαγορεύεται η οποιαδήποτε άλλη λειτουργία. Μέχρι και λυμένη άσκηση έχουμε που πάει και βάζει αυτάκια εκεί που κάνει εξαγωγή, παρακάτω από τις ουρές δηλαδή. Εκεί που δεν πειράζουμε τα στοιχεία του πίνακα, ε ας τα πειράξουμε για να μην μπερδευτούμε. Δεν υπάρχει λογική στο τι έχει γραφτεί.

Να επιμείνω στο δεν βλέπω που φταίει η ΓΛΩΣΣΑ σε αυτόν τον αχταρμά.

akalest0s

Κατάλαβα.
Για τη διαφορά adt / υλοποίηση, χρειάζεται μελέτη αλλά και να εμπλακείς και λίγο προσωπικά.. να δεις τι γίνεται στον "πραγματικό" προγραμματιστικό κόσμο, να γράψεις και λίγο "αληθινό" κώδικα... ειδικά αν κάποιος περιμένει να καταλάβει μέσα από το διδακτικό πακέτο και τη wikipedia, good luck with that.

Η Γλώσσα από μόνη της δεν φταίει, όντως. Είναι θέμα ξεκάθαρων ορισμών/σετ κανόνων. Και σε python να πάμε, αν δεν γίνει αυτό, τα ίδια προβλήματα θα έχουμε.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

gthal

@ApoAntonis ,
θίγεις αρκετά σωστά σημεία στο ποστ που έγραψες τη Δευτέρα το βράδυ.
Θα ήθελα να απαντήσω στο παρακάτω, αν μπορώ να προσφέρω κάτι, γιατί συμπληρώνει και τη συζήτηση που κάναμε την περασμένη βδομάδα με τον @akalest0s
Παράθεση από: ApoAntonis στις 24 Ιουν 2020, 08:48:29 ΜΜ
Το συμπληρωματικό υλικό αναφέρει στα πλεονεκτήματα, μειονεκτήματα λιστών και πινάκων, ότι η τυχαία πρόσβαση στις λίστες δεν επιτρέπεται. Πρώτο σημείο: Τι να υποθέσουμε για τις στοίβες και τις ουρές;
Δεύτερο σημείο: Ποιά είναι - και που ειπώθηκε- η συνθήκη κατά την οποία ότι η τυχαία προσπέλαση σε πίνακα δεν επιτρέπεται.
Αν καταλαβαίνω αυτό που λες είναι ότι "όταν η στοίβα πχ υλοποιείται με πίνακα, και αφού ο πίνακας είναι δομή τυχαίας προσπέλασης, γιατί απαγορεύεται να κάνω τυχαία προσπέλαση στη στοίβα".
Αν το καταλαβαίνω σωστά λοιπόν, η εξήγησή μου θα ξεκινήσει από το ότι η στοίβα, ακόμα κι αν υλοποιείται με πίνακα, δεν είναι πίνακας-δεν πρέπει να νοείται ως πίνακας.
Η δομή, καθορίζεται από τις λειτουργίες με τις οποίες θέλω να την εφοδιάσω (γιαυτό και στον ορισμό του βιβλίου εκτός από τα δεδομένα λέει ότι είναι και το σύνολο των λειτουργιών επί των δεδομένων). Έτσι, αυτό που διαφοροποιεί έναν σκέτο πίνακα, έναν πίνακα που "παριστάνει" τη στοίβα και έναν πίνακα που "παριστάνει" την ουρά, είναι το πώς θέλω να επιτρέψω να γίνεται η προσπέλαση των στοιχείων του, το πώς θέλω να "εισάγονται" ή να "λαμβάνονται" ξανά πίσω οι τιμές που αποθηκεύω (πχ εντελώς ελεύθερα, LIFO ή FIFO)
Εντάξει, η απόλυτη συμμόρφωση με ένα μοντέλο δεν είναι ποτέ εφικτή ούτε απαραίτητη (επιτρέπονται δλδ παρεκκλίσεις αν εξυπηρετούν) αλλά σίγουρα μια στοίβα πχ θα διαθέτει τα βασικά χαρακτηριστικά της στοίβας που είναι η LIFO λειτουργία της.

Νομίζω ότι όλα αυτά γίνονται ακόμα πιο κατανοητά αν δούμε τη στοίβα πχ ως αντικείμενο/κλάση.
Η στοίβα ως αντικείμενο θα ενσωμάτωνε ("ενθυλάκωση") τον πίνακα που χρησιμοποιεί για την αποθήκευση των δεδομένων της και τον δείκτη top της. Κανείς άλλος δε μπορεί να "βάλει χέρι" σε αυτά. Δλδ το κύριο πρόγραμμα δε μπορεί να βάλει κάτι όπου θέλει στον πίνακά της, δε μπορεί να αλλάξει την τιμή του top (ούτε καν να τη γνωρίζει αν δε θέλουμε) κλπ. Το μόνο που προσφέρει η στοίβα ως interface στον έξω κόσμο, είναι κάποιες μέθοδοι, και οι μόνες σίγουρες θα είναι η ώθηση και η απώθηση (αν θα θελα να έχει και άλλα χαρακτηριστικά, θα πρόσθετα κι άλλες). Δηλ η μόνη επικοινωνία που μπορεί να έχει το πρόγραμμα με τη στοίβα είναι να της δώσει μια τιμή (μέσω της ώθησης) και η στοίβα να τοποθετήσει την τιμή αυτή στον πίνακά της, όπως αυτή θέλει και γνωρίζει, ενημερώνοντας κατάλληλα, η ίδια, τον top της. Και αντίστοιχα το πρόγραμμα μπορεί επίσης να "ζητήσει" ένα στοιχείο από τη στοίβα μέσω της απώθησης και εκείνη θα του δώσει λογικά το στοιχείο της κορυφής της πάλι ενημερώνοντας τον  top της.

Στη ΓΛΩΣΣΑ βέβαια δε μπορούμε να φτιάξουμε στοίβα ως αντικείμενο, οπότε και ο πίνακάς της και ο τοπ της είναι έρμαια του κύριου προγράμματος αλλά μια σωστή πρακτική ώστε να παραμένουμε κοντά στο παραπάνω μοντέλο είναι ότι το πρόγραμμα δεν θα πειράζει όπως και όποτε γουστάρει τον τοπ ή τα περιεχόμενα του πίνακα αλλά μόνο όταν θέλει να ωθήσει ή να απωθήσει κάτι και σεβόμενο τη LIFO λογική της και όχι σαν να ήταν πίνακας. Η χρήση υποπρογραμμάτων μάλιστα, για την ώθηση και την απώθηση ενθαρρύνει αυτή τη σωστή πρακτική, ώστε ο top και τα περιεχόμενα του πίνακα να μεταβάλλονται μόνο μέσα στα υποπρογράμματα και όποτε το πρόγραμμα πάει να πειράξει κάτι από αυτά έτσι "χύμα" να καταλαβαίνουμε ότι αυτό "κάνει λίγο τζιιζ" και μήπως μπορούμε να το αποφύγουμε.
Φιλικά,
Γιώργος Θαλασσινός