Løsningsforslag - oppgaver i Avsnitt 4.2.3


Oppgave 1 og 2

import java.util.*;

public class TabellKø<T> implements Kø<T>
{
  private T[] a;      // en tabell
  private int fra;    // posisjonen til den første i køen
  private int til;    // posisjonen til første ledige plass

  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 TabellKø(int lengde)
  {
    if (lengde < 0) throw new
      IllegalArgumentException("Negativ tabellengde(" + lengde + ")!");

    lengde = lengde == 0 ? 1 : Integer.highestOneBit(lengde) << 1;

    if (lengde < 0)    // kan få oversvømmelse her
      throw new IllegalArgumentException("For stor tabellengde!");

    a = (T[])new Object[lengde];
    fra = til = 0;
  }

  public TabellKø()   // standardkonstruktør
  {
    this(8);
  }

  public void leggInn(T t)
  {
    a[til] = t;                         // ny verdi bakerst i køen
    til = (til + 1) & (a.length - 1);   // øker med 1
    if (fra == til)                     // sjekker om tabellen er full
      a = utvidTabell(2*a.length);      // dobler tabellen
  }

  public T taUt()
  {
    if (fra == til)                      // sjekker om køen er tom
      throw new NoSuchElementException("Køen er tom!");

    T temp = a[fra];                     // tar vare på den første i køen
    a[fra] = null;                       // nuller innholdet
    fra = (fra + 1) & (a.length - 1);    // øker fra med 1
    return temp;                         // returnerer den første
  }

  public T kikk()
  {
    if (fra == til)
      throw new NoSuchElementException("Køen er tom!");

    return a[fra];
  }

  public int antall()
  {
    return (til - fra) & (a.length - 1);
  }

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

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

  public String toString()
  {
    if (til == fra) return "[]";

    StringBuilder s = new StringBuilder();
    s.append('['); s.append(a[fra]);
    fra = (fra + 1) & (a.length - 1);

    while (fra != til)
    {
      s.append(','); s.append(' '); s.append(a[fra]);
      fra = (fra + 1) & (a.length - 1);
    }

    s.append(']');

    return s.toString();
  }

} // class TabellKø