IntStack.java

import java.io.*;

public class IntStack {
  // Stack mit automatischem Wachstum über Verdopplung
  
  private int[] a;    // Liste der Elemente
  private int last;   // Zahl der Elemente
  
  public IntStack() {
    // erzeugt einen Stack von Standardgröße
    this(100);
  }
  
  public IntStack(int size) {
    // erzeugt einen Stack der Größe size
    a = new int[size];
    last = 0;
  }
  
  public void push(int d) {
    // legt d auf dem Stack ab
    
    // ggf. internen Speicher vergrößern
    if (last == a.length) {
      int[] aNeu = new int[2*a.length];
      for (int i = 0; i < a.length; i++) {
        aNeu[i] = a[i];
      }
      a = aNeu;  // a ist dann reif für den Garbage Collector
    }
    
    a[last] = d;
    last++;
  }
  
  public int pop() {
    // holt oberstes Element vom Stack
    last--;
    return a[last];
  }
  
  public boolean empty() {
    // true, wenn kein Element implements Stack ist
    return (last == 0);
  }
  
  public double peek() {
    // gibt oberstes Element aus, ohne es zu entfernen
    return a[last - 1];
  }
  
  public static void main(String[] args) throws IOException {
    // kleines Testsprogramm
    
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    // Größe des Stackbuffers vom Benutzer abfragen
    String s;    // String für eingegebene Zeile
    System.out.println("Anfangsgröße des Stacks eingeben:");
    s = in.readLine();
    int size = Integer.parseInt(s);
    
    IntStack meinStack = new IntStack(size);
    
    // Stack füllen
    System.out.println("Positive Zahlen eingeben (beenden durch -1):");
    int neuerWert;
    do {
      s = in.readLine();
      neuerWert = Integer.parseInt(s);
      meinStack.push(neuerWert);
    } while (neuerWert >= 0);
    
    // letzten Wert wieder herausnehmen, war ja Ende-Zeichen
    meinStack.pop();
    
    // Ausgabe des Stacks
    System.out.println("Werte im Stack:");
    while (! meinStack.empty()) {
       System.out.println(meinStack.pop());
    }   
  }
}