Ουρές

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Ορισμός

Υλοποίηση στη μνήμη

Υλοποίηση σε 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  */
};

Υλοποίηση με συνδεδεμένη λίστα

Παράδειγμα

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);
}

Αφηρημένος τύπος

Ορισμός του τύπου της ουράς λίστας ακεραίων
typedef struct s_int_queue *int_queue;
Επιστρέφει μια άδεια ουρά
int_queue new_int_queue(void);
Το στοιχείο i εισάγεται στο τέλος της ουράς
void put_int_queue(int_queue q, int i);
Το στοιχείο από την αρχή της μη κενής ουράς αφαιρείται και επιστρέφεται
int get_int_queue(int_queue q);
Επιστρέφεται αληθές αν η ουρά είναι κενή
int isempty_int_queue(int_queue q);
Διαγράφει την ουρά
void delete_int_queue(int_queue q);

Εφαρμογές

Βιβλιογραφία

Ασκήσεις

Άσκηση 4

  1. Να υλοποιηθεί σε C ο αφηρημένος τύπος της ουράς ακεραίων σύμφωνα με τις παρακάτω συναρτήσεις:
    Επιστρέφει μια άδεια ουρά
    int_queue new_int_queue(void);
    Το στοιχείο i εισάγεται στο τέλος της ουράς
    void put_int_queue(int_queue q, int i);
    Το στοιχείο από την αρχή της μη κενής ουράς αφαιρείται και επιστρέφεται
    int get_int_queue(int_queue q);
    Επιστρέφεται αληθές αν η ουρά είναι κενή
    int isempty_int_queue(int_queue q);
  2. Με βάση τον αφηρημένο αυτό τύπο και μονοτονικά αυξανόμενη μεταβλητή να υλοποιηθεί πρόγραμμα το οποίο να υλοποιεί ουρά εξυπηρέτησης πελατών ως εξής:
    1. Όταν εισάγεται ο χαρακτήρας I (In) το πρόγραμμα τυπώνει τον αριθμό προτεραιότητας του νέου πελάτη.
    2. Όταν εισάγεται ο χαρακτήρας O (Out) το πρόγραμμα τυπώνει τον αριθμό προτεραιότητας του επόμενου πελάτη που θα εξυπηρετηθεί.
    Παράδειγμα:
    I
    1
    I
    2
    I
    3
    O
    1
    I
    4
    O
    2
    ...