Dovendo realizzare le classi
Stack
| Metodi pubblici: empty(), full(), size(), push(), pop(), top() |
Coda
| Metodi pubblici: vuota(), piena(), lunga(), accoda(), servi(), primo() |
si può osservare che c'è una quasi completa corrispondenza sia nelle strutture
dati (...) che nei metodi (accettando di rinominarli). Rimane la distinzione tra
push() e accoda().
Si presenta l'opportunità di utilizzare una superclasse
Lista
| Metodi pubblici: vuota(), piena(), lunga(), inserisci(), togli(),
primo() |
nella quale il metodo inserisci() non può essere implementato e quindi
sarà abstract.
public abstract class Lista
{
protected int elementiMax;
protected Object lista[];
protected int posizione;
public Lista(int n)
{
elementiMax=n;
lista=new Object[elementiMax];
posizione=-1;
}
public int lunga()
{
return posizione+1;
}
public boolean vuota()
{
return (lunga() == 0);
}
public boolean piena()
{
return (lunga() == elementiMax);
}
public Object primo()
{
if(vuota())
throw new ArrayIndexOutOfBoundsException("Lista vuota!");
else
return lista[posizione];
}
public Object togli()
{
Object temp=primo();
posizione--;
return temp;
}
public abstract void inserisci(Object obj);
}
La classe Pila estende la classe Lista implementando il metodo astratto
inserisci()
public class Pila extends Lista
{
public Pila(int n)
{
super(n);
}
public void inserisci(Object obj)
{
if(piena())
throw new ArrayIndexOutOfBoundsException("Lista piena!");
else
lista[++posizione]=obj;
}
}
La classe Coda estende la classe Lista implementando il metodo astratto
inserisci()
public class Coda extends Lista
{
public Coda(int n)
{
super(n);
}
public void inserisci(Object obj)
{
if(piena())
throw new ArrayIndexOutOfBoundsException("Lista piena!");
else
{
for(int i=posizione; i >= 0; i--)
lista[i+1]=lista[i];
lista[0]=obj;
posizione++;
}
}
} |