Løsningsforslag - oppgaver i Avsnitt 4.1.3


Oppgave 1 - 5

Her ligger hele klassen LenketStakk<T>:

import java.util.*;

public class LenketStakk<T> implements Stakk<T>
{
  private static final class Node<T>     // en indre nodeklasse
  {
    T verdi;
    Node<T> neste;

    Node(T verdi, Node<T> neste)    // nodekonstruktør
    {
      this.verdi = verdi;
      this.neste = neste;
    }

  } // class Node

  private Node<T> hode;         // stakkens topp
  private int antall;           // antall på stakken

  public LenketStakk()       // konstruktør
  {
    hode = null;
    antall = 0;
  }

  @Override
  public void leggInn(T verdi)
  {
    hode = new Node<>(verdi,hode);
    antall++;
  }

  @Override
  public T kikk()
  {
    if (antall == 0)
      throw new NoSuchElementException("Stakken er tom!");
    return hode.verdi;
  }

  @Override
  public T taUt()
  {
    if (antall == 0)
      throw new NoSuchElementException("Stakken er tom!");

    T temp = hode.verdi;
    hode = hode.neste;
    antall--;

    return temp;
  }

  @Override
  public boolean tom()
  {
    return antall == 0;
  }

  @Override
  public int antall()
  {
    return antall;
  }

  @Override
  public void nullstill()
  {
    hode = null;
    antall = 0;
  }

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

    StringBuilder s = new StringBuilder();

    Node<T> p = hode;
    s.append('['); s.append(p.verdi);

    p = p.neste;
    while (p != null)
    {
      s.append(','); s.append(' '); s.append(p.verdi);
      p = p.neste;
    }
    s.append(']');

    return s.toString();
  }

} // class LenketStakk

Oppgave 6

Det kan se ut som TabellStakk er en god del mer effektiv enn LenketStakk. Da undertegnede brukte en en 2.80GHz Intel Pentium med Windows XP og Java 1.6, tok det 3,3 sekunder med LenketStakk, men bare 0,8 sekunder med TabellStakk.

Oppgave 7

Tidene for Stack, ArrayDeque og LinkedList ble henholdsvis 1,9, 0,8 og 4,7 sekunder. Det betyr at ArrayDeque er den beste å bruke når en trenger en stakk.