Θεωρία, Ερωτήσεις Ανάπτυξης, Quiz & Ασκήσεις
Ουρά (queue) ονομάζεται μια δομή δεδομένων το σύνολο των στοιχείων της οποίας είναι διατεταγμένο με τέτοιο τρόπο, ώστε τα στοιχεία που εισέρχονται πρώτα να λαμβάνονται πρώτα, ενώ αυτά που εισέρχονται τελευταία, λαμβάνονται τελευταία.
Παραδείγματα από την καθημερινότητα:
Οι κύριες λειτουργίες που εκτελούνται σε μια ουρά είναι δύο:
Εισαγωγή στοιχείου στο πίσω άκρο της ουράς.
Εξαγωγή στοιχείου από το εμπρός άκρο της ουράς.
Χρησιμοποιούμε δύο μεταβλητές:
rear και front θεωρούμε το μηδέν (0).
Η εισαγωγή ενός νέου στοιχείου γίνεται από το πίσω άκρο της ουράς:
rear κατά έναrearΗ εξαγωγή ενός στοιχείου γίνεται από το εμπρός άκρο της ουράς:
front κατά έναΔοκίμασε να προσθέσεις και να αφαιρέσεις στοιχεία. Παρατήρησε πώς κινούνται οι δείκτες front και rear:
Τμήμα προγράμματος που υλοποιεί την εισαγωγή στοιχείου σε ουρά, με χρήση μονοδιάστατου πίνακα Α, 10 θέσεων:
ΓΡΑΨΕ 'Δώσε στοιχείο για εισαγωγή στην ουρά Α:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ rear = 10 ΤΟΤΕ
ΓΡΑΨΕ 'Γεμάτη ουρά'
ΑΛΛΙΩΣ_ΑΝ (front = 0 ΚΑΙ rear = 0) ΤΟΤΕ
front ← 1
rear ← 1
A[rear] ← στοιχείο
ΑΛΛΙΩΣ
rear ← rear + 1
A[rear] ← στοιχείο
ΤΕΛΟΣ_ΑΝ
Τμήμα προγράμματος που υλοποιεί την εξαγωγή στοιχείου από ουρά, με χρήση μονοδιάστατου πίνακα Α, 10 θέσεων:
ΑΝ (front = 0 ΚΑΙ rear = 0) ΤΟΤΕ
ΓΡΑΨΕ 'Άδεια ουρά'
ΑΛΛΙΩΣ_ΑΝ (front = rear) ΤΟΤΕ
ΓΡΑΨΕ 'Εξάγεται το στοιχείο:', Α[front]
front ← 0
rear ← 0
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Εξάγεται το στοιχείο:', Α[front]
front ← front + 1
ΤΕΛΟΣ_ΑΝ
Ουρά (queue) ονομάζεται μια δομή δεδομένων το σύνολο των στοιχείων της οποίας είναι διατεταγμένο με τέτοιο τρόπο, ώστε τα στοιχεία που εισέρχονται πρώτα να λαμβάνονται πρώτα, ενώ αυτά που εισέρχονται τελευταία, λαμβάνονται τελευταία.
Η παραπάνω μέθοδος ονομάζεται Πρώτο Μέσα, Πρώτο Έξω ή FIFO (= First In First Out).
Οι κύριες λειτουργίες που εκτελούνται σε μια ουρά είναι δύο:
Χρησιμοποιούμε δύο μεταβλητές:
Ως αρχικές τιμές των μεταβλητών rear και front θεωρούμε το μηδέν.
Εισαγωγή: Η εισαγωγή ενός νέου στοιχείου γίνεται από το πίσω άκρο της ουράς και η τιμή της μεταβλητής rear αλλάζει ως εξής: rear ← rear + 1. Κατά την εισαγωγή, πρώτα αυξάνουμε τον δείκτη rear κατά ένα και μετά εισάγουμε το στοιχείο στον πίνακα.
Εξαγωγή: Η εξαγωγή ενός στοιχείου γίνεται από το εμπρός άκρο της ουράς και η τιμή της μεταβλητής front αλλάζει ως εξής: front ← front + 1. Κατά την εξαγωγή ενός στοιχείου, αυξάνεται ο δείκτης front κατά ένα (δείχνει στην επόμενη θέση του πίνακα) χωρίς στην πραγματικότητα να γίνεται καμία παρέμβαση στα περιεχόμενα του πίνακα (χωρίς να διαγράφεται κάποιο στοιχείο).
ΓΡΑΨΕ 'Δώσε στοιχείο για εισαγωγή στην ουρά Α:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ rear = 10 ΤΟΤΕ
ΓΡΑΨΕ 'Γεμάτη ουρά'
ΑΛΛΙΩΣ_ΑΝ (front = 0 ΚΑΙ rear = 0) ΤΟΤΕ
front ← 1
rear ← 1
A[rear] ← στοιχείο
ΑΛΛΙΩΣ
rear ← rear + 1
A[rear] ← στοιχείο
ΤΕΛΟΣ_ΑΝ
ΑΝ (front = 0 ΚΑΙ rear = 0) ΤΟΤΕ
ΓΡΑΨΕ 'Άδεια ουρά'
ΑΛΛΙΩΣ_ΑΝ (front = rear) ΤΟΤΕ
ΓΡΑΨΕ 'Εξάγεται το στοιχείο:', Α[front]
front ← 0
rear ← 0
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Εξάγεται το στοιχείο:', Α[front]
front ← front + 1
ΤΕΛΟΣ_ΑΝ
Έστω ουρά με πίνακα Α 10 θέσεων. Αρχικά front=0, rear=0.
Εκτελούμε: Εισαγωγή(10), Εισαγωγή(20), Εισαγωγή(30), Εξαγωγή(), Εισαγωγή(40)
| Λειτουργία | front | rear |
|---|---|---|
| Αρχή | 0 | 0 |
| Εισαγωγή(10) | 1 | 1 |
| Εισαγωγή(20) | 1 | 2 |
| Εισαγωγή(30) | 1 | 3 |
| Εξαγωγή() | 2 | 3 |
| Εισαγωγή(40) | 2 | 4 |
Τελικά: front = 2, rear = 4
Στοιχεία στην ουρά: Α[2]=20, Α[3]=30, Α[4]=40
Όταν front = rear (και δεν είναι και τα δύο 0), η ουρά έχει ακριβώς ένα στοιχείο.
Αν κάνουμε Εξαγωγή σε αυτή την περίπτωση:
Έστω αρχικά front=0, rear=0. Εκτελούμε:
rear ← rear + 1
Α[rear] ← 5
rear ← rear + 1
Α[rear] ← 10
rear ← rear + 1
Α[rear] ← 15
front ← front + 1
Αποτέλεσμα:
Συνεχίζουμε από το προηγούμενο παράδειγμα (front=1, rear=3):
front ← front + 1
front ← front + 1
Αποτέλεσμα:
Συνεχίζουμε (front=3, rear=3):
ΑΝ front = rear ΤΟΤΕ
ΓΡΑΨΕ 'Εξάγεται:', Α[front]
front ← 0
rear ← 0
ΤΕΛΟΣ_ΑΝ
Αποτέλεσμα:
| Χαρακτηριστικό | Στοίβα (Stack) | Ουρά (Queue) |
|---|---|---|
| Αρχή | LIFO (Last In, First Out) | FIFO (First In, First Out) |
| Εισαγωγή | Στην κορυφή (Push) | Στο πίσω άκρο (Enqueue) |
| Εξαγωγή | Από την κορυφή (Pop) | Από το εμπρός άκρο (Dequeue) |
| Παράδειγμα | Στοίβα πιάτων | Ουρά σε ταμείο |
Πλεονεκτήματα:
Μειονεκτήματα:
Από την καθημερινότητα:
Από την Πληροφορική:
Η κυκλική ουρά (circular queue) είναι μια παραλλαγή της ουράς που λύνει το πρόβλημα των "κενών θέσεων":
mod: θέση ← (θέση mod ΜΕΓΕΘΟΣ) + 1Παράδειγμα: Αν ΜΕΓΕΘΟΣ=5 και είμαστε στη θέση 5, η επόμενη θέση είναι (5 mod 5) + 1 = 1.
Έχουμε ουρά με πίνακα Α 10 θέσεων. Αρχικά front = 0, rear = 0. Εκτελούμε:
Εισαγωγή(10), Εισαγωγή(20), Εισαγωγή(30), Εξαγωγή(), Εισαγωγή(40), Εξαγωγή()
Ποιες είναι οι τελικές τιμές των front και rear; Ποια στοιχεία περιέχει η ουρά;
Λύση:
| Λειτουργία | front | rear | Περιεχόμενο |
|---|---|---|---|
| Αρχή | 0 | 0 | Άδεια |
| Εισαγωγή(10) | 1 | 1 | Α[1]=10 |
| Εισαγωγή(20) | 1 | 2 | Α[1]=10, Α[2]=20 |
| Εισαγωγή(30) | 1 | 3 | Α[1]=10, Α[2]=20, Α[3]=30 |
| Εξαγωγή() | 2 | 3 | Εξάγεται το 10 |
| Εισαγωγή(40) | 2 | 4 | Α[4]=40 |
| Εξαγωγή() | 3 | 4 | Εξάγεται το 20 |
Τελικά: front = 3, rear = 4
Στοιχεία στην ουρά: Α[3]=30, Α[4]=40
Συμπλήρωσε τα κενά:
Γράψε τμήμα προγράμματος σε ΓΛΩΣΣΑ που:
! Εισαγωγή 5 στοιχείων
front ← 0
rear ← 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5
ΓΡΑΨΕ 'Δώσε στοιχείο:'
ΔΙΑΒΑΣΕ στοιχείο
ΑΝ (front = 0 ΚΑΙ rear = 0) ΤΟΤΕ
front ← 1
rear ← 1
Α[rear] ← στοιχείο
ΑΛΛΙΩΣ
rear ← rear + 1
Α[rear] ← στοιχείο
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εμφάνιση όλων των στοιχείων
ΓΡΑΨΕ 'Στοιχεία ουράς:'
ΓΙΑ i ΑΠΟ front ΜΕΧΡΙ rear
ΓΡΑΨΕ Α[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Χαρακτήρισε τις παρακάτω προτάσεις ως Σωστές ή Λάθος: