Lista <- Stack, Coda

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