// Un'altra implementazione della Coda di Interi:
// La classe IntQueue1.
// Il numero massimo di elemnti della coda e` una variabile di
// istanza.
// Ci sono due metodi costruttori (overloading). 
// Il secondo costruttore ha come parametro il numero massimo 
// di elementi della coda. 
// Il primo costruttore, senza parametri, invoca il secondo 
// (istruzione this(100)), passando come parametro la costante 100.
 
class IntQueue1{

    // Numero massimo di elementi della coda
    private int max_el;

    // Numero di elementi in coda
    private int el_number;

    // Array di elementi della coda
    private int[] elements;

    // Indice del primo elemento
    private int first;
    
    // Primo costruttore (senza parametri)
    public IntQueue1(){
	this(100); // invoca l'altro costruttore
    }

    // Secondo costruttore, con parametro il numero massimo di
    //  elementi della coda
    public IntQueue1(int max){

	elements=new int[max];
        max_el=max;
	first=0;
	el_number=0;
    }


    // Test di coda vuota
    public boolean emptyQueue(){
	
	return (el_number == 0);
	
    }

    // Restituisce il numero di elementi della coda
    public int getLen(){
	
	return (el_number);
	
    }



    // Restituisce il primo elemento in coda
    public int headQueue(){
	if (this.emptyQueue()) {
	    System.out.println("Errore: coda vuota");
	    return -1;
	}
	else return (elements[first]);
    }

 
    // Toglie il primo elemento dalla coda
    public void deQueue(){
	if (this.emptyQueue()) 
	    System.out.println("Errore: coda vuota");
	else {
	    el_number--;
	    first = ((first +1) % max_el);
	}
    }


    // Aggiunge un elemento in coda
    public void enQueue(int e) {
	if (max_el <= el_number)
	    System.out.println("Errore: coda piena");
	else {
	    elements[(first+el_number)%max_el]=e;
	    el_number++;
	}
    }
	   

    // Stampa gli elementi della coda
    public void printQueue() {
	if (emptyQueue())
	    System.out.println("Coda vuota");
	else{
	    System.out.println("Elementi della coda:");
	      for (int i=0; i< el_number; i++)
		System.out.println(elements[(first+i)%max_el]);
	    }
    }

}

      
