Eigene Stack Klasse

sh33p

Bekanntes Mitglied
Ich habe folgende Stack-Klasse,die auf einem Array basiert:

Java:
public final class Stack {

 private int count; // aktuelle Zahl der Elemente - 1
 // Index des obersten Elements

 private int[] a = new int[10];


 public Stack () { // Konstruktor, erzeugt den leeren Stapel
 count = -1;
 }


 public int top() { // liefert das oberste Element
 // Vorbedingung: Stapel nicht leer
 if (count<=9 && count>=0) {
 return a[count];
 } else
 return -999;
 }

 //  legt Element ab
 public void push(final int x){
 // Vorbedingung: Stapel nicht voll
 if (count<9) {
 
 count++;
 a[count] = x;
 }
 }
 public void pop(){ // veraendert Stapel-Zustand: entfernt oberstes Element
 // Vorbedingung: Stapel nicht leer
 if (count>=0) {
 count--;
 }
 }
 }
 
 // Klasseninvariante: count darf nicht außerhalb -1 <= count <= 9 liegen

Nun soll ich ein Testklasse mit main funktion schreiben, mit Drei push-pop-top-Folgen der Laenge > 5 unter Einhaltung der Stack- Invariante und Zwei nichtleere push-pop-top-Folgen mit Verletzung der Stack-Invariante.

Die Stack Invariante lautet ja in dieser Implementierung: count darf nicht außerhalb -1 <= count <= 9 liegen.

Was ist bitte mit 3 push-pop-top folgen der Länge 5 gemeint??

Java:
public class StackTB {

  public static void main(String[] args) {
  // 3 push top -pop- top folgen der laenge 5??
  Stack s1 = new Stack();
  s1.push(2); //Oben drauflegen
  s1.pop(); // entfernen
  s1.top(); //lesen
  s1.push(3);
  s1.pop();
  
  s1.push(4); //Oben drauflegen
  s1.pop(); // entfernen
  s1.top(); //lesen
  s1.push(5);
  s1.pop();
  
  
  s1.push(4); //Oben drauflegen
  s1.pop(); // entfernen
  s1.top(); //lesen
  s1.push(5);
  s1.pop();
  
  }
}
 
M

Marcinek

Gast
Genau sowas ist es

Java:
 s1.push(4); //Oben drauflegen
  s1.pop(); // entfernen
  s1.top(); //lesen
  s1.push(5);
  s1.pop();
 

Landei

Top Contributor
Ja.

Übrigens würde ich bei einem leerem Stack in top() und pop() eine Exception werfen (NoSuchElementException würde sich anbieten)
 

sh33p

Bekanntes Mitglied
danke.

ich habe noch eine weitere frage. wie kann ich den Stack dynamisch machen?D.h wenn festgestellt wird,das das Array voll wird-> Speicherplatz verdoppeln.
Ist eigentlich nur mit einer ArrayList möglich oder?
Müsste ich natürlich alles auf eine Arraylist umbauen..
 

Ein Keks

Bekanntes Mitglied
eine ArrayList benutzt intern auch ein array (daher der name)
du musst einfach ein neues array mit der neuen größe erstellen und den inhalt des alten reinkopieren (z.B mit System.arraycopy)
 
M

Marcinek

Gast
im sinne der übung würde ich versuchen es ohne die arrayliste machen.

weil man sonst auch ein Stack nutzen kann ;)

Mit nichten benutzt ArrayList intern ein Array (Sorry, da war ich in einem falschen Universum) - Siehe posting unten...
 
Zuletzt bearbeitet von einem Moderator:

sh33p

Bekanntes Mitglied
ich habe jetzt versucht die Verdoppelungsstrategie zu implementieren. Nur es klappt noch nicht ganz.wo liegt der fehler?

[Java]

private int count; // aktuelle Zahl der Elemente -1

private int[] a = new int[10]; // Ablageplatz fuer die Elemente
private int[] b = new int[count*2]; // Zweites Array zum verdoppeln

// a[0]...a[count] sind die gestapelten Elemente
// a[count] ist das oberste, a[0] das unterste
// INV: -1 <= count <= 9

public StackDYN() { // Konstruktor, erzeugt den leeren Stapel
count = -1;
}

public int top(){ //Oberste Element lesen


if(count > a.length)
return b[count];
else
return a[count];


}
public void push(final int x) { //Oberste Element drauflegen
if(count >9){

System.arraycopy(a,0,b,0,b.length);
}

if(count < 9){
count++;
a[count] = x;
}
}

public void pop() { // Oberste Element entfern
try{
if (count >= 0)
count--;
if(count <-1)
throw new Exception();
}catch(Exception z){
}
}
}
[/code]
 
M

Marcinek

Gast
1. Wenn du eine exeption wirst und sie direkt fängst, dann kannst du sie dir schenken

2. Du musst nur ein tmp array haben, und wenn count über aktuelle size hinweggeht, dann wird der aktuelle Stand in den neuen kopiert und dann die referenzen vertauscht, so dass du immer mit nur einem array arbeitest.

3. man würde im Konstruktor eine start kapazität angeben

4. so statische sachen wie count < 9 kann man auch nimma verwenden
 

sh33p

Bekanntes Mitglied
ok und wie mache ich das mit dem tmp array?
ich hol mir die kapazität durch eingabe über die konsole.wenn die kapazität > 10 ist, dann neues anlegen?
wie gehts dann weiter?
 
M

Marcinek

Gast
Java:
if(count > a.length) {
    int[] b = new int[a.lenth * 2];
   copy a nach b
   b = a;
}

a[count] = x;
 

sh33p

Bekanntes Mitglied
Java:
public int top(){     //Oberste Element lesen


   if(count < 9){
    return a[count];
   }else
   return b[count];

}
 public void push(final int x)  {   //Oberste Element drauflegen
 if(count >9){

   System.arraycopy(a,0,b,0,b.length);
   b = a;
}

a[count] = x;


}

jetzt hagelts eine indexoutofbounds -1 exception^^
 
M

Marcinek

Gast
ja ich sehe auch wo...

und (top) muss man auch noch mal überdenken

Aber das wirst du schon schaffen...
 

sh33p

Bekanntes Mitglied
so die -1 exception hab ich weg..kriege es aber einfach nicht gebacken,das top dann auf den richtigen index zugreift, wenn es muss..bitte helft mir :bahnhof:
 

Final_Striker

Top Contributor
Was soll dieses zweite b array?

Erst wenn das erste voll ist, erzeugst du ein neues z.B. mit doppelter Größe
kopierst die Inhalte von a rein

Java:
int temp = new int[a.length * 2];
// Inhalte kopieren
a = temp;
 

sh33p

Bekanntes Mitglied
ok.aber wie differenze ich das in der top() methode?

Wenn ich das ursprüngliche array (<9 werte) habe,muss ich auf das zugreifen, und bei dem 2. array (bei > 9) werte auf das..wie setze ich das in quellcode um?
 
M

Marcinek

Gast
warum funktioniert es nicht und warum möchtest du auf das temp zugreifen? - Meine Glaskugel scheint ein wenig defekt zu sein...

Weißt du, was temporär (temp) bedeutet?

Male dir ein Stack auf und daneben dein count und wie sich das ändert.

Dann siehst du die Lösung.


---
Hast du ein Java Buch schon mal angeschaut??

Ansonsten kann ich dir auch Nachhilfe (kostenpflichtig) anbieten.
 

Landei

Top Contributor
Ich bin immer noch der Meinung, dass es ohne Array besser geht...

Java:
import java.util.Iterator;
import java.util.NoSuchElementException;

public class Stack<E> implements Iterable<E> {
    private Node<E> tos = new Nil<E>();

    public boolean isEmpty() { return tos.isEmpty(); }
    public void push(E e) { tos = tos.push(e); }
    public E top() { return tos.top(); }
    public E pop() {
        E e = tos.top();
        tos = tos.pop();
        return e;
    }

    public Iterator<E> iterator() {
        return new Iterator<E>(){
            Node<E> node = tos;
            public boolean hasNext() {  return ! node.isEmpty(); }
            public E next() {
                E e = node.top();
                node = node.pop();
                return e;
            }
            public void remove() {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        };
    }

    private static abstract class Node<E> {
        abstract E top();
        abstract Node<E> pop();
        abstract boolean isEmpty();
        Cons<E> push(E f) { return new Cons(f, this); }
    }

    private static class Cons<E> extends Node<E> {
        private final E e;
        private final Node<E> next;
        private Cons(E e, Node<E> next) {
            this.e = e;
            this.next = next;
        }
        public E top() { return e; }
        public Node<E> pop() { return next; }
        public boolean isEmpty() { return false; }
    }

    private static class Nil<E> extends Node<E> {
        public E top() { return null; }
        public Node<E> pop() { throw new NoSuchElementException("Stack empty!"); }
        public boolean isEmpty() { return true; }
    }
}
 

ARadauer

Top Contributor
Kommt mir bekannt vor: http://www.java-forum.org/java-basics-anfaenger-themen/107866-exceptions-push-pop-stack.html

Ok:
1. Verwirf deine "Verdopplungs Strategie". Wenn dein array zu klein wird, machst du dir ein temp, das doppelt so groß ist, kopierst um und weißt temp deinem ursprünglichen zu.
Die Idee dass, wenn das erste voll ist du mit dem zweiten weiterarbeitest ist. a) falsch b) blödsinn ;-)

2. Räum deinen Code mal auf. Sauber formatieren, einrücken, unnötiges herumgebastle raus werfen.

Funktionierts dann immer noch nicht: poste ihn im anderen Thread, dann helf ich dir. Is wahrscheinlich dann nur noch eine Kleinigkeit...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Eigene Stack Klasse schreiben Java Basics - Anfänger-Themen 12
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
G eigene Bibliothek einbinden Java Basics - Anfänger-Themen 1
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
A Eigene Methoden entwicken Java Basics - Anfänger-Themen 3
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
H GSON-Bibliothek für eigene Programme benutzen Java Basics - Anfänger-Themen 2
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
R eigene Graphikbedienelemente Java Basics - Anfänger-Themen 8
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
P Java 8 & Eigene Applets Java Basics - Anfänger-Themen 3
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
G eigene Bibliothek in Java importieren Java Basics - Anfänger-Themen 5
D Klassen Eigene Klasse für ArrayList Java Basics - Anfänger-Themen 6
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
J Eigene Klasse für die Variablen? Java Basics - Anfänger-Themen 3
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
O Denkanstöße für eigene Konfigurations-Datei Java Basics - Anfänger-Themen 12
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C eigene Exception Java Basics - Anfänger-Themen 4
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
S Eigene Exception Klasse - fehlender Konstruktor mit String Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
A Objekte in eigene Klasse auslagern Java Basics - Anfänger-Themen 2
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
E Eigene Stackklasse Java Basics - Anfänger-Themen 7
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
S Eigene Exception Schreiben und Welche Auslösen wie ? Java Basics - Anfänger-Themen 7
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
N Eigene Methoden-> Werte übergeben Java Basics - Anfänger-Themen 5
U Klassen Eigene Klassen importieren Java Basics - Anfänger-Themen 13
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E Object in eigene Klasse umwandeln? Java Basics - Anfänger-Themen 7
S Eigene Klassen addieren Java Basics - Anfänger-Themen 3
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
E Eigene class datum Java Basics - Anfänger-Themen 2
G Eigene MessageBox kreieren Java Basics - Anfänger-Themen 9
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
F Klassen Eigene Klasse definieren Java Basics - Anfänger-Themen 4
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
X Eigene Libary Java Basics - Anfänger-Themen 2
Crashbreaker Eigene Java-Programm ohne hilfe des CMD starten Java Basics - Anfänger-Themen 11
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
T eigene Exception Klasse Java Basics - Anfänger-Themen 12
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
P Vererbung Basisklasse soll eigene Methode benutzen Java Basics - Anfänger-Themen 38
F Eigene Klasse für die Keys von HashMap Java Basics - Anfänger-Themen 5
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
G Eigene Klasse als Array, zugriff? Java Basics - Anfänger-Themen 2
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
dataframe OOP Eigene typisierte Liste Java Basics - Anfänger-Themen 3
W GUI als eigene Klasse oder in die Startklasse? Java Basics - Anfänger-Themen 21
T Konstruktor für eigene Klasse erstellen Java Basics - Anfänger-Themen 6
H Buttonbefehle in eigene Klasse schreiben Java Basics - Anfänger-Themen 8
M Datentypen Eigene iterierbare Liste Java Basics - Anfänger-Themen 4
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
S Klassendiagramm - nur eigene Klassen? Java Basics - Anfänger-Themen 3
nrg Eigene simple List-Klasse programmieren Java Basics - Anfänger-Themen 3
C Eigene Interpreter-Programmiersprache mit Java Java Basics - Anfänger-Themen 17
B eigene Exception.... Java Basics - Anfänger-Themen 5
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
F Eigene Exception StackTrace und Message ist leer warum??? Java Basics - Anfänger-Themen 3
M Eigene Pakete in Eclipse erstellen Java Basics - Anfänger-Themen 5
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
H eigene Schriftarten registrieren Java Basics - Anfänger-Themen 5
Kasoki Eigene Funktionen / Commands Java Basics - Anfänger-Themen 14
M Eigene LinkedList und Nodes Java Basics - Anfänger-Themen 20
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben