Løsningsforslag - oppgaver i Avsnitt 4.3.3


Oppgave 1

import java.util.NoSuchElementException;

public class TabellToveiskø<T> implements Toveiskø<T>
{
  private T[] a;
  private int fra, til;

  private T[] utvidTabell(int lengde)
  {
    T[] b = (T[])new Object[lengde];  // ny tabell

    // kopierer intervallet a[fra:a.length> over i b
    System.arraycopy(a,fra,b,0,a.length - fra);

    // kopierer intervallet a[0:fra> over i b
    System.arraycopy(a,0,b,a.length - fra, fra);

    fra = 0; til = a.length;

    return b;
  }

  public TabellToveiskø(int størrelse)
  {
    a = (T[]) new Object[størrelse + 1];
    fra = til = 0;
  }

  public TabellToveiskø()
  {
    this(8);
  }

  public int antall()
  {
    if (fra <= til) return til - fra;
    else return a.length + til - fra;
  }

  public boolean tom()
  {
    return fra == til;
  }

  public void leggInnSist(T t)
  {
    a[til++] = t;
    if (til == a.length) til = 0;
    if (fra == til) a = utvidTabell(2*a.length);
  }

  public void leggInnFørst(T t)
  {
    if (fra == 0) fra = a.length - 1; else fra--;
    a[fra] = t;
    if (fra == til) a = utvidTabell(2*a.length);  // dobler tabellen
  }

  public T kikkFørst()
  {
    if (tom()) throw new NoSuchElementException("Køen er tom!");
    return a[fra];
  }

  public T kikkSist()
  {
    if (fra == til) throw new NoSuchElementException("Køen er tom!");
    if (til == 0) return a[a.length - 1];
    else return a[til - 1];
  }

  public T taUtFørst()
  {
    if (tom()) throw new NoSuchElementException("Køen er tom!");

    T temp = a[fra];
    a[fra] = null;
    fra++;
    if (fra == a.length) fra = 0;
    return temp;
  }

  public T taUtSist()
  {
    if (fra == til) throw new NoSuchElementException("Køen er tom!");
    if (til == 0) til = a.length - 1; else til--;
    T temp = a[til];
    a[til] = null;
    return temp;
  }

  public void nullstill()
  {
    while (fra != til)
    {
      a[fra++] = null;
      if (fra == a.length) fra = 0;
    }
  }

  public String toString()
  {
    if (tom()) return "[]";

    StringBuilder s = new StringBuilder();
    s.append('[');

    s.append(a[fra]);

    if (fra < til)
    {
     for (int i = fra + 1; i < til; i++)
       s.append(',').append(' ').append(a[i]);
    }
    else
    {
      for (int i = fra + 1; i < a.length; i++)
        s.append(',').append(' ').append(a[i]);
      for (int i = 0; i < til; i++)
        s.append(',').append(' ').append(a[i]);
    }
    s.append(']');

    return s.toString();
  }

} // TabellToveiskø