import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Wohlgeformt {
// Ueberprueft den gegebenen String auf Wohlgeformtheit
static void check (String str) {
boolean stringIsClosingClamp = false; // Lässt die Suchschleife nach einer geschlossenen Klammer weiterlaufen, wird true gesetzt, wenn geschlossene Klammer gefunden und beendet die Schleife.
char ClosingClampRound = ')';
char ClosingClampCurved = '}';
char ClosingClampBoxed = ']'; // Definitionen für die geschlossenen Klammern
int i = str.length(); // Variablendeklaration der gesamten Stringlänge des Klammernausdrucks
int x = 0; // "Leseposition"
if (i == 0) {System.out.println("Na, Klammern sollten sie schon eingeben!");
return;}
if (i % 2 == 1) {System.out.println("Der Ausdruck kann nicht wohlgeformt sein, da die Zahl der Klammern ungerade ist!");
return;}
while (x < i && stringIsClosingClamp == false) { // Während der Index x der zu untersuchenden Klammer kleiner i, also der gesamten Stringlänge ist und noch keine geschlossene Klammer gefunden wurde, tue...
if (str.charAt(x) == ClosingClampRound || str.charAt(x) == ClosingClampCurved || str.charAt(x) == ClosingClampBoxed)// Wenn die untersuchte Klammer ")","}" oder "]" ist, setze stringIsClosingClamp auf true
{stringIsClosingClamp = true;}
else x = x+1; // Wenn keine schließende Klammer kam, wechsle zur nächsten Stelle im String und Probiere von vorn
char OpeningClampRound = '('; // Deklaration weiterer Klammern
char OpeningClampCurved = '{';
char OpeningClampBoxed = '[';
if (stringIsClosingClamp == true){ // Wenn eine Geschlossene Klammer kam, überprüfe, welche und prüfe, ob die dazu passende Klammer davor steht => Wenn ja entferne die beiden Klammern, setze x zurück und stringIsClosedClamp auf falsch, um die nächsten Klammern zu prüfen
if (str.charAt(x) == ClosingClampRound){
if (str.charAt(x-1) == OpeningClampRound){
str = removeCharAt(removeCharAt(str, x-1), x-1); // entferne x-1 und das neue x-1 aus dem Substring, das vorher an der Stelle x war. Das ganze wird als neuer String definiert
{stringIsClosingClamp = false;} // Variable zurücksetzen und so while-schleife von vorn beginnen
{x = 0;} // x auf 0 setzen, damit von vorn gelesen wird
{i = i-2;} // i=i-2 setzen, da sich die Stringlänge um 2 verkleinert hat
}
else {System.out.println("Der Ausdruck ist nicht wohlgeformt!"); // Falls die davor stehende Klammer nicht passt, ist der Ausdruck nicht wohlgeformt
return;} // verlasse die Funktion
}
else if (str.charAt(x) == ClosingClampCurved){ // Überprüfe die andere Klammersorte
if (str.charAt(x-1) == OpeningClampCurved){
str = removeCharAt(removeCharAt(str, x-1), x-1);
{stringIsClosingClamp = false;}
{x = 0;}
{i = i-2;}
}
else {System.out.println("Der Ausdruck ist nicht wohlgeformt!");
return;}
}
else if (str.charAt(x) == ClosingClampBoxed){ // Auch die 3. Klammersorte wird geprüft
if (str.charAt(x-1) == OpeningClampBoxed){
str = removeCharAt(removeCharAt(str, x-1), x-1);
{stringIsClosingClamp = false;}
{x = 0;}
{i = i-2;}
}
else {System.out.println("Der Ausdruck ist nicht wohlgeformt!");
return;}
}
}
}
System.out.println("Der Ausdruck ist wohlgeformt!"); // Ans Ende der Funktion gelangt man nur, wenn vorher kein Fehler auftrat => Wohlgeformtheit
}
public static String removeCharAt(String s, int pos) { // Entferne den Char an der Stelle "pos" und gebe den substring aus
return s.substring(0,pos)+s.substring(pos+1);
}
public static void main(String[] args) {
// Konsoleneingabe vorbereiten
// (die Tastatureingabe wird gelesen und in gepufferter Form gesichert)
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Bitte geben Sie einen Klammerausdruck ein:");
// Zum Lesen der Eingabe muss eine Ausnahmebehandlung (Exception) eingefuegt werden,
// da waehrend des Einlesens unerwartete Fehler auftreten koennten
try {
// der gelesene Klammerausdruck wird an die Methode check uebergeben
// wo er auf Wohlgeformtheit ueberprueft wird
check(input.readLine());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}