Dovendo realizzare le classi Stack e Coda con i metodi pubblici seguenti
- Stack: empty(), full(), size(), push(), pop(), top()
- Coda: 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 con i metodi pubblici seguenti
- Lista: 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); // MANCA IL CORPO DEL METODO! }
La classe Lista non è istanziabile ma possiede il costruttore…
La classe Stack estende la classe Lista implementando il metodo astratto inserisci()
public class Stack extends Lista { public Stack(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++; } } }