![]() |
|
|
|||||||
| Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Neuer Benutzer
short
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Hallo.
Ich habe begonnen einen Stack zu implementieren, denn ich nun auch fertig geschrieben habe. Hier schon mal der Quelltext: Code:
public class Stack {
public static final int CAPACITY = 1000;
// Default-Laenge des Arrays
private int capacity;
// verwendete Laenge des Arrays
private int[] S;
// Array S um Stack zu implementieren
private int top = -1;
// Position des obersten Elements im Stack
public Stack () {
this(CAPACITY);
}
public Stack (int cap) {
capacity = cap;
S = new int [capacity];
}
// nur Initialisierung des Stacks
public int size () {
return (top + 1);
}
// gibt Hoehe des Stacks aus
public boolean isEmpty () {
return (top < 0);
}
public void push (int element) throws StackException {
if (size() == capacity)
throw new StackException("Stack ist voll");
S[++top] = element;
}
public int top() throws StackException {
if (isEmpty())
throw new StackException("Stack ist leer");
return S[top];
}
public int pop () throws StackException{
if (isEmpty()) {
throw new StackException("Stack ist leer");
}
int element = S[top--];
return element;
}
}
Nun wollte ich den Inhalt des Arrays in ein großeres Array kopieren, falls das Array voll sein sollte. Code:
public class StackTestDrive {
public static void main(String [] args) throws StackException {
Stack Test = new Stack(5);
Test.push(1);
Test.push(2);
Test.push(3);
Test.push(4);
Test.push(5);
System.out.println(Test.size());
System.out.println(Test.isEmpty());
Test.push(6);
}
}
Dieses Programm bricht mit der Exception "Stack ist voll" ab. Dies soll aber nicht passieren, sondern die einzelnen Elemente sollen nun in ein großeres Array kopiert werden. Mir ist bekannt, dass ich eine Methode arraycopy() gibt, aber ich kann diese nicht einbauen. Kann mir da vielleicht einer helfen? Wäre echt super. Vielen Dank. |
|
|
| #2 (permalink) | |
|
Premium-Benutzer
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
|
Sowas?
Code:
int[] oldS = ... // dein s int[] newS = new int[ oldS.length * 2 + 1 ]; // nächster Array mit doppelter Grösse System.arraycopy( oldS, 0, newS, 0, oldS.length ); // kopieren oldS = newS; // zuweisen |
|
|
| #3 (permalink) | |
|
Neuer Benutzer
short
Themenstarter
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Das sieht prinzipiell schon mal nicht schlecht aus, aber wo in den Code packe ich das hin, und was gehört genau in die Zeile
Code:
int [] oldS = ... Der Abschnitt müsste doch eigentlich in die PUSH-Methode, da nur dort dieser Fehler auftreten kann. Dieser Abschnitt läuft leider nicht: Code:
int[] newS = new int[ oldS.length * 2 + 1 ]; |
|
|
| #4 (permalink) | ||||||||||||||||||||||||||||||||||||||||||||||
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 24.11.2005
Fachbeiträge: 3.182
Abgegebene Danke: 7
Erhielt 89 Danke für 89 Beiträge
|
Code:
int[] oldS = S;
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| #5 (permalink) | |
|
Neuer Benutzer
short
Themenstarter
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Hallo.
Also ich habe jetzt insgesamt diese beiden Klassen, wie folgt programmiert: Code:
public class Stack {
public static final int CAPACITY = 1000;
// Default-Laenge des Arrays
private int capacity;
// verwendete Laenge des Arrays
private int[] S;
private int[] newS;
// Array S um Stack zu implementieren
private int top = -1;
// Position des obersten Elements im Stack
public Stack () {
this(CAPACITY);
}
public Stack (int cap) {
capacity = cap;
S = new int [capacity];
}
// nur Initialisierung des Stacks
public int size () {
return (top + 1);
}
// gibt Hoehe des Stacks aus
public boolean isEmpty () {
return (top < 0);
}
public void push (int element) throws StackException {
if (size() == capacity) {
int[] oldS = S;
newS = new int[oldS.length * 2 + 1 ];
System.arraycopy(oldS, 0, newS, 0, oldS.length );
oldS = newS; // zuweisen
}
S[++top] = element;
}
public int top() throws StackException {
if (isEmpty())
throw new StackException("Stack ist leer");
return S[top];
}
public int pop () throws StackException{
if (isEmpty()) {
throw new StackException("Stack ist leer");
}
int element = S[top--];
return element;
}
}
public class StackTestDrive {
public static void main(String [] args) throws StackException {
Stack Test = new Stack(5);
Test.push(1);
Test.push(2);
Test.push(3);
Test.push(4);
Test.push(5);
System.out.println(Test.size());
System.out.println(Test.isEmpty());
Test.push(6);
System.out.println(Test.size());
}
}
Wenn ich nun das Programm starte, dann müssete eigentlich bei dem Test.push(6) das Array vergrößert werden, aber leider erhalte ich die folgende Fehlermeldung! Code:
5 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at edu.cau.informatikII.vorlesungsprogramme.Stack.push(Stack.java:44) at edu.cau.informatikII.vorlesungsprogramme.StackTestDrive.main(StackTestDrive.java:16) false |
|
|
| #6 (permalink) | |
|
Neuer Benutzer
short
Themenstarter
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Also. Das Programm schmeisst keine Fehlermeldung mehr, aber es erzielt nicht das gewünschte Ergebnis:
Code:
package edu.cau.informatikII.vorlesungsprogramme;
public class Stack {
public static final int CAPACITY = 1000;
// Default-Laenge des Arrays
private int capacity;
// verwendete Laenge des Arrays
private int[] S;
private int[] newS;
// Array S um Stack zu implementieren
private int top = -1;
// Position des obersten Elements im Stack
public Stack () {
this(CAPACITY);
}
public Stack (int cap) {
capacity = cap;
S = new int [capacity];
}
// nur Initialisierung des Stacks
public int size () {
return (top + 1);
}
// gibt Hoehe des Stacks aus
public boolean isEmpty () {
return (top < 0);
}
public void push (int element) throws StackException {
if (size() == capacity) {
int[] oldS = S;
newS = new int[oldS.length * 2 + 1 ];
System.arraycopy( oldS, 0, newS, 0, oldS.length ); // kopieren
//newS = oldS; // zuweisen
}
else {
S[++top] = element;
}
}
public int top() throws StackException {
if (isEmpty())
throw new StackException("Stack ist leer");
return S[top];
}
public int pop () throws StackException{
if (isEmpty()) {
throw new StackException("Stack ist leer");
}
int element = S[top--];
return element;
}
}
Mit meinem Beispiel ergibt das: Code:
public class StackTestDrive {
public static void main(String [] args) throws StackException {
Stack Test = new Stack(5);
Test.push(2);
Test.push(4);
Test.push(6);
Test.push(8);
Test.push(10);
System.out.println(Test.size());
System.out.println(Test.isEmpty());
System.out.println(Test.top());
Test.push(12);
System.out.println(Test.top());
Test.push(23);
System.out.println(Test.top());
}
}
Code:
5 false 10 10 10 |
|
|
| #7 (permalink) | |
|
Premium-Benutzer
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
|
Code:
public void push (int element) throws StackException {
if (size() == S.length ){
int[] newS = new int[ S.length * 2 + 1 ]; // nächster Array mit doppelter Grösse
System.arraycopy( S, 0, newS, 0, S.length ); // kopieren
S = newS; // zuweisen
}
S[++top] = element;
}
|
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Info eines Webseites kopieren | Gast | Netzwerkprogrammierung | 16 | 26.04.2007 22:07 |
| Ausgabe eines Arrays | Eleanor | Java Basics - Anfänger-Themen | 3 | 18.01.2006 14:19 |
| Problem bei Kopieren eines Ordners | rtt | Allgemeine Java-Themen | 13 | 09.08.2005 11:50 |
| eigenschaften eines objekt kopieren. how? | b166-er | Java Basics - Anfänger-Themen | 8 | 10.02.2005 11:51 |
| Inhalt eines JPanel kopieren | dirkop | AWT, Swing, JavaFX & SWT | 7 | 19.07.2004 15:40 |
| Lesezeichen |
|
|