Java CharStack overflow!

marko06

Cadet 4th Year
Registriert
Juni 2008
Beiträge
93
Hallo Leute,

ich musste für eine Aufgabe in der Uni ein CharStack schreiben und bräuchte noch bei einer Kleinigkeit eure Hilfe.
Ich weiß nicht genau wie ich es einbauen kann, falls ein Überlauf auftritt, dass eine entsprechende Fehlermeldung in der Methode push ausgegeben wird und das Programm beendet wird. Ich verstehe nicht genau was in dem Bezug mit Überlauf gemeint ist.


Danke schonmal

Code:
import java.util.Scanner;

public class CharStackProgramm {
		private static Scanner in;
		
		public static void main (String[] args) {
				in = new Scanner(System.in);
				System.out.print("Bitte geben Sie ein Wort ein: ");
				
				String x = in.next();
				
				int stringLaenge = x.length();
				
				CharStack myStack = new CharStack(stringLaenge);
				
				int i=0;
				
				while (i < x.length())
						myStack.push(x.charAt(i++));
				
				while (! myStack.is_empty())
						System.out.print(myStack.pop());
		}
}

class CharStack {
		private int top;
		private char[] stack;
		private boolean overflow;
		
		public CharStack(int laenge) {
				top = 0
				stack = new char[laenge];
		}
		
		public void push (char zeichen) {
				stack[top++] = zeichen;
		}
		
		public char pop() {
				return stack[--top];
		}
		
		public boolean is_empty() {
				return (top == 0);
		}
}
 
Mit Überlauf ist gemeint, dass du mehr in das Array schreibst als Platz vorhanden ist.
Du kannst in der push-Methode ein try-catch-Block schreiben oder wenn es ein Anfängerprojekt ist einfach eine if-Abfrage.
If(top >= laenge){
syso...("Fehlermeldung");
}

Edit:
DaZpoon hat recht, ich hab mir den Konstruktor nicht genau angeguckt. Dann natürlich auf "laenge" prüfen.
 
Zuletzt bearbeitet: (Formatierung und Rechtschreibung überarbeitet)
Dein Stack soll eine feste Länge bekommen (siehe Konstruktor). Bei jedem Push solltest du nun prüfen ob du diese Länge nicht schon überschreitest. Das heißt: Länge speichern (im Konstruktor), beim Push prüfen ob top < länge und ggf. exception werfen oder ein print machen. jedenfalls nicht ins array schreiben. Gleiches beim Poppen (:evillol:): Schauen ob "top" > 0 ist, erst dann das zeichen vom array ausgeben.

Ich hoffe das genügt als Denkhilfe.
 
Also ich bin mir jetzt nicht hundertprozent sicher, was genau dein Problem ist, aber ich versuch mal zu helfen.

Einen overflow wird produziert, wenn du versuchst, Daten über den reservierten Speicherplatz hinaus anzufügen.
Sprich, wenn du eine String-Länge von 10 möglichen Zeichen hast, aber versuchst, 11 Zeichen zu speichern.

Demnach müsstest du in deiner push-Funktion prüfen, ob stack[] an der Stelle stack[top] überhaupt noch Speicher zur Verfügung steht.
 
Dein Stack hat ja eine festgelegte Größe (stringLaenge). Wenn du also einen Stack mit größe 5 erstellst, 5 Elemente inzufügst dann sollte bein Versuch ein 6tes Element hinzuzufügen eine Meldung kommen.

Wurde gesagt ob ihr das mit einem richtigen Exceptionhandler machen sollt oder einfach nur eine kurze Syso-Ausgabe? Falls letzteres kannst du z.B. so machen: die Laenge die die im Konstruktor übergibst muss irgendwo zwischen gespeichert werden in der Klasse damit die push Methode später überprüfen kann ob die max. Größe erreicht wurde.

Dann in der Push.

if(stack.size() == maxLaenge){
// Es sind schon max. Elemente im Stack, Fehlermeldung ausgeben
}else{
// Es ist noch Platz, Element hinzufügen
}
 
Danke schonmal an alle.

@Mika 911 Verstehe, aber ich hab in meine Klasse ein private boolean overflow; wie verwende ich das genau in meinem Quelltext, weil das war eine Vorlage und ich muss das dann so übernehmen.
Ergänzung ()

zoz schrieb:
Dein Stack hat ja eine festgelegte Größe (stringLaenge). Wenn du also einen Stack mit größe 5 erstellst, 5 Elemente inzufügst dann sollte bein Versuch ein 6tes Element hinzuzufügen eine Meldung kommen.

Wurde gesagt ob ihr das mit einem richtigen Exceptionhandler machen sollt oder einfach nur eine kurze Syso-Ausgabe? Falls letzteres kannst du z.B. so machen: die Laenge die die im Konstruktor übergibst muss irgendwo zwischen gespeichert werden in der Klasse damit die push Methode später überprüfen kann ob die max. Größe erreicht wurde.

Dann in der Push.

if(stack.size() == maxLaenge){
// Es sind schon max. Elemente im Stack, Fehlermeldung ausgeben
}else{
// Es ist noch Platz, Element hinzufügen
}

Nur eine normale syso, da es noch eine Anfänger Aufgabe ist.
Ergänzung ()

Ich habe etwas übersehen, ich muss in der main-Methode, zuerst die maximale Größe des Stacks einlesen. Das steht noch in der Aufgabenstellung dazu Wichtig: Nach dem Einlesen der Int-Variablen steht im Eingabepuffer noch das abschließende Return für die Zahl. Bevor der nachfolgende Text eingelesen wird, muss der Puffer noch geleert werden, zum Beispiel durch ein zusätzliches nextLine().
 
Zuletzt bearbeitet:
Wenn du deine private Variable für den Overflow verwenden möchtest, muss du in der Klasse zumindest eine getter-Methode machen, die den Overflow-wert zurück liefert. Dann kannst du prüfen, ob dieser true ist oder nicht und entsprechend eine Meldung ausgeben.
Ich hoffe getter und setter-Methoden sagen dir etwas.
 
Zurück
Oben