31.6 Lösungen
 
Aufgabe 1
Download:
JKellerDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import listen.adt.*;

public class JKellerDemo extends JFrame
                         implements ActionListener {
  
  JPanel zentrumPanel;
  JTextField eingabePush, ausgabe;
  JButton bPush, bIsEmpty, bPop, bTop;
  Keller keller;

  public JKellerDemo (String title) {

    super (title);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    setSize(300, 200);

    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    zentrumPanel = new JPanel(new GridLayout(2,2,4,4));
    cp.add(zentrumPanel,BorderLayout.CENTER);

    eingabePush = new JTextField("0",12);
    cp.add(eingabePush,BorderLayout.NORTH);

    bPush = new JButton("push");
    zentrumPanel.add(bPush);
    bPush.addActionListener(this);

    bPop = new JButton("pop");
    zentrumPanel.add(bPop);
    bPop.setEnabled(false);
    bPop.addActionListener(this);

    bIsEmpty = new JButton("isEmpty");
    zentrumPanel.add(bIsEmpty);
    bIsEmpty.addActionListener(this);

    bTop = new JButton("top");
    zentrumPanel.add(bTop);
    bTop.setEnabled(false);
    bTop.addActionListener(this);

    ausgabe = new JTextField("");
    cp.add(ausgabe,BorderLayout.SOUTH);
    ausgabe.setEditable(false);

    keller = new Keller();

    setVisible(true);
  }

  public void actionPerformed(ActionEvent e){
    Object obj = e.getSource();

    if (obj == (Object) bPush){
       keller.push(eingabePush.getText());
       bTop.setEnabled(true);
       bPop.setEnabled(true);
       ausgabe.setText(""+ keller.top() + " ist eingekellert!");
    }
    if (obj == bPop){
       ausgabe.setText(""+ keller.top() + " wird vom Keller entfernt!");
       keller.pop();
       if (keller.isEmpty()){
         bPop.setEnabled(false);
         bTop.setEnabled(false);
       }
    }
    if (obj == bIsEmpty){
       if(keller.isEmpty())ausgabe.setText("Der Keller ist leer");
       else ausgabe.setText("Der Keller ist nicht leer");
    }
    if (obj == bTop){
       ausgabe.setText("Oberstes Kellerelement ist: " + keller.top());
    }
  }

  public static void main (String[] args) {
    new JKellerDemo("JKellerDemo");
  }
}


Abb. 26.6.1 GUI zum Keller
Aufgabe 2

Download:
KellerA1.java

import listen.adt.*;
public class KellerA1 {

  private static Keller k;
  
  private static void ausgeben(){
    Keller kellerTMP = new Keller();
    while(!k.isEmpty()){
       System.out.println(k.top());
       kellerTMP.push(k.top());
       k.pop();
    }
    k = kellerTMP;
  }
  
  public KellerA1(){
    k = new Keller();
    //Aufbau des Kellers k1
    for (int i=1; i<= 10; i++){
       k.push(new Integer(i));
    }
    ausgeben();
  }
  
  public static void main (String[] args) {
     new KellerA1();
  }
}
10
9
8
7
6
5
4
3
2
1
Aufgabe 3

Download:
KellerA2.java

import listen.adt.*;

public class KellerA2 {

  private static Keller k;
  
  private static void ausgeben(){
    Keller kellerTMP = new Keller();
    while(!k.isEmpty()){
       System.out.println(k.top());
       kellerTMP.push(k.top());
       k.pop();
    }
    k = kellerTMP;
  }
  
  public KellerA2(){
    k = new Keller();
    //Aufbau des Kellers k
    for (int i=1; i<= 10; i++){
       k.push(new Integer(i));
    }
    ausgeben();
    while (!k.isEmpty()){
      System.out.println(k.top());
      k.pop();
    }
  }
  
  public static void main (String[] args) {
     new KellerA2();
  }
}
  Wie die 'Wiederholung der Ausgabe' zeigt, besitzt der Keller nach der Ausgabe zwar den gleichen Inhalt, die Reihenfolge allerdings ist umgekehrt, das ursprünglich zuletzt eingegebene Element, das sich im Originalkeller ganz 'oben' befindet, ist nach der Ausgabe ganz 'unten' eingekellert.

10
9
8
7
6
5
4
3
2
1
1
2
3
4
5
6
7
8
9
10

 

Aufgabe 4

Download:
KellerA3.java

Gegenüber KellerA2 wird lediglich die Methode ausgeben() verändert. Anstelle der Schleife setzen wir eine rekursive Methode
ausgeben()
. Beim rekursiven Abstieg werden die Elemente aus dem Keller ausgegeben und in ein Object-ELement  gespeichert. Beim rekursiven Aufstieg dann werden die Elemente wieder auf den Keller gelegt. Da dies in umgekehrter Reihenfolge geschieht, das zuletzt aus dem Keller geholte Element wird wieder als erstes eingekellert, enthält der Keller seine alten Elemente wieder in der ursprünglichen Reihenfolge. Man beachte, dass man ohne einen spezifizierten zweiten Keller auskommt. Tatsächlich müssen die im Laufe des rekursiven Abstiegs erzeugten Object-Elemente verwaltet werden. Die VM von Java legt diese Objekte auf einen eigenen Stack (= Keller).
  private static void ausgeben(){
    if(!k.isEmpty()){
      Object e = k.top();
      System.out.println(e);
      k.pop();
      ausgeben();
      k.push(e);
    }
  }
zu 31.7 Liste vom Typ FIFO
zur Startseite www.pohlig.de  (C) MPohlig 2006