Gestione della Coda

Ritratto di Geny

In informatica per coda si intende una struttura dati di tipo FIFO: First In First Out cioè.. il primo in ingresso è il primo ad uscire.

Un esempio pratico sono le code che in un paese civile(Italia esclusa) si fanno per ottenere un servizio, come pagare al supermercato o farsi tagliare i capelli dal parrucchiere: idealmente si viene serviti nello stesso ordine con cui ci si è presentati.

Questo tipo di struttura dati è molto utilizzata in informatica, ad esempio nella gestione delle operazioni da eseguire da parte di un sistema operativo, ed è fondamentale nelle telecomunicazioni, in particolare nelle reti a commutazione di pacchetto, dove descrive la gestione dei pacchetti in attesa di essere trasmessi su un collegamento.

Le operazioni su una coda sono: enqueue, dequeue, front, isEmpty, isFull.

Enqueue: accodamento di un elemento, serve a mettere un elemento in coda.
Dequeue: rimozione dell'elemento in testa alla coda.
Front: legge l'elemento in testa alla coda senza rimuoverlo.
is_Empty: restituisce true se la coda è vuota.
Is_Full: restituisce true se la pila è piena (nel caso l'implementazione preveda una capacità massima ).

 

/*
 * File: main.cpp
 * Author: Geny
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 5

void enqueue(int[], int&);
int dequeue(int[], int&);
void visual(int[], int, int);

int main()
{
    int v[MAX], scelta, t = 0, c = -1, f = 0;

    do
    {
        printf("----------------\n");
        printf("MENU: ");

        if ((((c + 1) % MAX) == t) && (f == 0))
        {
            printf("Coda Vuota \n");
            printf("1) Inserimento \n");
            printf("9) Uscita \n");
            printf("\nTua scelta => ");
            scanf("%d", &scelta);
            switch (scelta)
            {
            case 1:
                enqueue(v, c);
                f = 1;
                break;
            case 9:
                break; // Exit opzione valida(nn dare errore) ma verrà eseguita piu avanti dal while
            default:
                printf("Opzione non valida! \n");
                break;
            }

        }
        else if ((((c + 1) % MAX) == t) && (f == 1))
        {
            printf("Coda Piena \n");
            printf("2) Estrazione \n");
            printf("3) Visualizz. \n");
            printf("9) Uscita \n");

            printf("\nTua scelta => ");
            scanf("%d", &scelta);
            switch (scelta)
            {
            case 2:
                dequeue(v, t);
                f = 0;
                break;
            case 3:
                visual(v, t, c);
                break;
            case 9:
                break; // Exit opzione valida(nn dare errore) ma verrà eseguita piu avanti dal while
            default:
                printf("Opzione non valida! \n");
                break;
            }

        }
        else
        {
            printf("Coda non Vuota e non Piena \n");
            printf("1) Inserimento \n");
            printf("2) Estrazione \n");
            printf("3) Visualizz. \n");
            printf("9) Uscita \n");
            printf("\nTua scelta => ");
            scanf("%d", &scelta);
            switch (scelta)
            {
            case 1:
                enqueue(v, c);
                f = 1;
                break;
            case 2:
                dequeue(v, t);
                f = 0;
                break;
            case 3:
                visual(v, t, c);
                break;
            case 9:
                break; // Exit opzione valida(nn dare errore) ma verrà eseguita piu avanti dal while
            default:
                printf("Opzione non valida! \n");
                break;
            }
        }
        printf("\n\n");
    }
    while (scelta != 9); // Exit
    return (EXIT_SUCCESS);
}

// Funzioni

void enqueue(int v[], int &k)
{
    k = (k + 1) % MAX; // Inc l'indice della coda(k) in una pos libera per ins
    printf("Numero da inserire in posizione %d => ", k);
    scanf("%d", &v[k]);
}

int dequeue(int v[], int &k)
{
    int e = v[k];
    //printf("E' stato estratto il numero %d che si trovava nella posiz %d", v[k], k);
    printf("Estrazione della posizione %d : \n", k);
    printf("Numero = %d\n", v[k]);
    k = (k + 1) % MAX; // Inc l'indice della testa(k) all'elemento sucessivo
    return (e);
}

void visual(int v[], int k, int j)
{
    printf("Coda = ");
    do
    {
        printf(" v[%d]=%d ", k, v[k]);
        k = ((k + 1) % MAX); // se arrivi in fondo al vettore riparti dall'inizio fino araggiungere l'indice di coda
    }
    while (k != (j + 1) % MAX);
}