Υλοποίηση σε C
Υλοποίηση με πίνακα
- Η ουρά μπορεί να υλοποιηθεί με τη χρήση ενός πίνακα.
- Δύο ξεχωριστές μεταβλητές δείχνουν την αρχή και το τέλος της ουράς.
- Απαραίτητοι οι έλεγχοι για υπερχείλιση και υποχείλιση.
- Ο πίνακας (ή δείκτης σε αυτόν) καθώς και οι μεταβλητές της αρχής και
του τέλους μπορούν να ομαδοποιηθούν σε μια εγγραφή.
Παράδειγμα 1
struct s_int_queue {
int values[20]; /* Array of values */
int head; /* Head of queue (values[head]) */
int tail; /* Tail of queue (values[tail]) */
};
Παράδειγμα 2
struct s_int_queue {
int *values; /* Allocated array of values */
int values_size; /* Number of values allocated */
int head; /* Head of queue (values[head]) */
int tail; /* Tail of queue (values[tail]) */
};
Παράδειγμα 3
struct s_int_queue {
int *values_start; /* Start of allocated array of values */
int *values_end; /* End of allocated array of values */
int *head; /* Head of queue */
int *tail; /* Tail of queue */
};
Υλοποίηση με συνδεδεμένη λίστα
- Η ουρά μπορεί να υλοποιηθεί με τη μιας συνδεδεμένης λίστας
- Δύο ξεχωριστές μεταβλητές δείχνουν τα στοιχεία της λίστας που
αποτελούν την αρχή και το τέλος της ουράς.
Η
αρχή της ουράς (queue head)
(το σημείο από το οποίο αφαιρούνται τα στοιχεία) είναι
η αρχή της λίστας,
το τέλος της ουράς (queue tail)
είναι το τέλος της λίστας.
- Οι δείκτες στην αρχή το τέλος της λίστας μπορούν να ομαδοποιηθούν
σε μια εγγραφή.
Παράδειγμα
struct s_int_list {
int val;
struct s_int_list *next;
};
struct s_int_queue {
struct s_int_list *head;
struct s_int_list *tail;
};
/* Add an element to the queue */
void
int_queue_put(struct s_int_queue *q, int v)
{
struct s_int_list *p;
p = (struct s_int_list *)malloc(sizeof(struct s_int_list));
p->next = NULL;
p->val = v;
if (q->tail != NULL)
q->tail->next = p; /* Add element to queue tail */
else
q->head = p; /* Special case for empty queue */
q->tail = p;
}
/* Remove and return an element from a non-empty queue */
int
int_queue_get(struct s_int_queue *q)
{
int v;
struct s_int_list *tmp;
assert(q->head != NULL);
v = q->head->val;
if (q->head->next == NULL)
q->tail = NULL; /* Special case for empty queue */
tmp = q->head->next;
free(q->head);
q->head = tmp;
return (v);
}