K08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού
Κώστας Χατζηκοκολάκης
a.k.a. Dynamic/Growable/Resizable/Mutable Array, Array List, List, …
// Ένα vector αναπαριστάται από τον τύπο Vector. Ο χρήστης δε χρειάζεται να
// γνωρίζει το περιεχόμενο του τύπου αυτού, απλά χρησιμοποιεί τις συναρτήσεις
// vector_<foo> που δέχονται και επιστρέφουν Vector.
//
// Ο τύπος Vector ορίζεται ως pointer στο "struct vector" του οποίου το
// περιεχόμενο είναι άγνωστο (incomplete struct), και εξαρτάται από την
// υλοποίηση του ADT Vector.
typedef struct vector* Vector;
// Δημιουργεί και επιστρέφει ένα νεό vector μεγέθους size, με στοιχεία
// αρχικοποιημένα σε NULL. Αν δεν υπάρχει διαθέσιμη μνήμη επιστρέφει
// VECTOR_FAIL.
Vector vector_create(int size, DestroyFunc destroy_value);
// Ελευθερώνει όλη τη μνήμη που δεσμεύει το vector vec.
void vector_destroy(Vector vec);
An initial size is given at creation (ignore destroy_value
for now).
// Επιστρέφει την τιμή στη θέση pos του vector vec (μη ορισμένο αποτέλεσμα αν
// pos < 0 ή pos >= size)
Pointer vector_get_at(Vector vec, int pos);
// Αλλάζει την τιμή στη θέση pos του Vector vec σε value. ΔΕΝ μεταβάλλει το
// μέγεθος του vector, αν pos >= size το αποτέλεσμα δεν είναι ορισμένο.
void vector_set_at(Vector vec, int pos, Pointer value);
[4, 6, 2, 1]
1
: 6
8
at 0
: [8, 6, 2, 1]
// Προσθέτει την τιμή value στο _τέλος_ του vector vec. Το μέγεθος του vector
// μεγαλώνει κατά 1. Αν δεν υπάρχει διαθέσιμη μνήμη το vector παραμένει όπως
// ήταν (αυτό μπορεί να ελεγχθεί με τη vector_size)
void vector_insert_last(Vector vec, Pointer value);
// Επιστρέφει την τιμή της τελευταίας θέσης του vector.
// Το μέγεθος του vector μικραίνει κατά 1.
void vector_remove_last(Vector vec);
[4, 6, 2, 1]
3
: [4, 6, 2, 1, 3]
[4, 6, 2, 1]
// Βρίσκει και επιστρέφει το πρώτο στοιχείο στο vector που να είναι ίσο με value
// (με βάση τη συνάρτηση compare), ή NULL αν δεν βρεθεί κανένα στοιχείο.
Pointer vector_find(Vector vec, Pointer value, CompareFunc compare);
// Μέσω random access
int size = vector_size(vec);
for (int i = 0; i < size; i++) {
int* value = vector_get_at(vec, i);
printf("%d\n", *value);
}
// Μέσω κόμβων
for(VectorNode node = vector_first(vec); // ξενικάμε από τον πρώτο κόμβο
node != VECTOR_EOF; // μέχρι να φτάσουμε στο EOF
node = vector_next(vec, node)) { // μετάβαση στον επόμενο κόμβο
int* value = vector_node_value(vec, node); // η τιμή του συγκεκριμένου κόμβου
printf("value: %d\n", *value);
}
Pointer
s)destroy_value
function to be called when a value is removedVector vec = vector_create(0, free);
vector_insert_last(vec, strdup("foo"));
vector_insert_last(vec, strdup("bar"));
vector_remove_last(vec); // free bar
vector_destroy(vec); // free foo (και destroy το ίδιο το vector)
a.k.a. Forward list (also, “List” sometimes means something else)
// Προσθέτει έναν νέο κόμβο __μετά__ τον node, ή στην αρχή αν node == LIST_BOF,
// με περιεχόμενο value.
void list_insert_next(List list, ListNode node, Pointer value);
// Αφαιρεί τον __επόμενο__ κόμβο από τον node, ή τον πρώτο κόμβο αν node == LIST_BOF.
void list_remove_next(List list, ListNode node);
(4, 6, 2, 1)
3
after 6
: (4, 6, 3, 2, 1)
4
: (4, 3, 2, 1)
// Μόνο μέσω κόμβων
for(ListNode node = list_first(list); // ξενικάμε από τον πρώτο κόμβο
node != LIST_EOF; // μέχρι να φτάσουμε στο EOF
node = list_next(list, node)) { // μετάβαση στον επόμενο κόμβο
int* value = list_node_value(list, node); // η τιμή του συγκεκριμένου κόμβου
printf("value: %d\n", *value);
}
Same as for Vectors.
List list_create(DestroyFunc destroy_value);
// Επιστρέφει τον αριθμό στοιχείων που περιέχει η λίστα.
int list_size(List list);
// Επιστρέφει την πρώτη τιμή που είναι ισοδύναμη με value
// (με βάση τη συνάρτηση compare), ή NULL αν δεν υπάρχει
Pointer list_find(List list, Pointer value, CompareFunc compare);
// Ελευθερώνει όλη τη μνήμη που δεσμεύει η λίστα list.
// Οποιαδήποτε λειτουργία πάνω στη λίστα μετά το destroy είναι μη ορισμένη.
void list_destroy(List list);
// Επιστρέφει το στοιχείο στην κορυφή της στοίβας (μη ορισμένο αποτέλεσμα αν η
// στοίβα είναι κενή)
Pointer stack_top(Stack stack);
// Προσθέτει την τιμή value στην κορυφή της στοίβας stack.
void stack_insert_top(Stack stack, Pointer value);
// Αφαιρεί την τιμή στην κορυφή της στοίβας (μη ορισμένο
// αποτέλεσμα αν η στοίβα είναι κενή)
void stack_remove_top(Stack stack);
[4, 6, 2, 1]
3
: [4, 6, 2, 1, 3]
[4, 6, 2, 1]
Determine whether parentheses/brackets balance properly in algebraic expressions.
Example:
$ \{ a^2 -[(b+c)^2 - (d+e)^2] * [\sin(x-y)] \} - \cos(x+y)$
This expression contains parentheses, square brackets, and braces in balanced pairs according to the pattern
$\{ [ ( ) ( ) ] [ ( ) ] \} ( )$
(, [, {
we insert it to the stack.), ], }
we remove the top item and check that its type matchesInfix | Postfix |
---|---|
(a + b) | a b + |
(x - y - z) | x y - z - |
(x - y - z) / (u + v) | x y - z - u v + / |
(a^2 + b^2) * (m - n) | a 2 ^ b 2 ^ + m n - * |
((5*(9+8))+7)
into
postfix.5 9 8 + * 7 +
Input | Output | Stack |
---|---|---|
( | ||
( | ||
5 | 5 | |
* | * | |
( | * | |
9 | 9 | * |
+ | * + | |
8 | 8 | * + |
) | + | * |
) | * | |
+ | + | |
7 | 7 | + |
) | + |
// Επιστρέφει το στοιχείο στο μπροστινό μέρος της ουράς
Pointer queue_front(Queue queue);
// Επιστρέφει το στοιχείο στο πίσω μέρος της ουράς
Pointer queue_back(Queue queue);
// Προσθέτει την τιμή value στo πίσω μέρος της ουράς queue.
void queue_insert_back(Queue queue, Pointer value);
// Αφαιρεί την τιμή στο μπροστά μέρος της ουράς
void queue_remove_front(Queue queue);
[4, 6, 2, 1]
3
: [4, 6, 2, 1, 3]
[6, 2, 1, 3]
t
rand
)duration
also randomlyduration
seconds, compute its waiting time