Subato

BracketChecker2

Stacks und Klammern

Implementieren Sie eine Klasse, die mittels eines Stacks die korrekte Klammerung eines Java-Programms prüft. Die Klammerung ist genau dann korrekt, wenn jede öffnende Klammer eine passende schließende Klammer hat.

  • Implementieren Sie zunächst die Klasse ArrayStack genauso wie in den Videos. Eine dynamische Reallokation ist nicht gefordert, wählen Sie einfach ein Array ausreichender Größe.
  • Verwenden Sie nun Ihren Stack zur Klammern-Prüfung: Durchlaufen Sie den Code Buchstabe für Buchstabe und pushen Sie jede öffnende Klammer ('(', '[' oder '{') auf den Stack. Für jede schließende Klammer entfernen Sie das oberste Element vom Stack und prüfen ob die Klammer vom Stack auf die gerade gelesene Klammer passt. Alle anderen Zeichen außer Klammern werden ignoriert.
  • Es existiert bereits eine Methode checkFile(String path). Diese liest eine Datei ein und überprüft die Klammerung des Datei-Inhalts mit check(). Prüfen Sie mit checkFile() die Korrektheit der Klammerung einer Ihrer Java-Klassen. Bauen Sie dann Klammern-Fehler an verschiedenen Stellen ein und validieren Sie, dass checkFile() diese meldet.

Hinweise: Mit toCharArray() verwandeln Sie einen String in ein Array von Buchstaben.


package de.hsrm.ads; import java.util.ArrayList; import java.lang.System; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.NoSuchElementException; public class BracketChecker { public static interface Stack<T> { public void push(T e); public void pop() throws NoSuchElementException; public T top() throws NoSuchElementException; public boolean isEmpty(); public int size(); } public static class ArrayStack<T> implements Stack<T>{ public ArrayStack(int capacity) { // FIXME: implement } // FIXME: implement interfaces' methods } public static boolean check(String toCheck, int capacity) { // FIXME: implement } private static String[] readStringArray(String filename) { // open a file, read its lines, return them as an array. try { ArrayList<String> lines = new ArrayList<String>(); // Kein Scanner, wäre viel zu langsam // Erzwingen von UTF-8 (sonst komische Ergebnisse unter Windows) Reader in = new InputStreamReader(new FileInputStream(filename), "UTF-8"); BufferedReader reader = new BufferedReader(in); String s; while ((s = reader.readLine()) != null) { if (s.length() != 0 ) lines.add(s); } reader.close(); String[] result = new String[lines.size()]; return lines.toArray(result); } catch (IOException e) { String msg = "I/O-Fehler bei " + filename + "\n" + e.getMessage(); throw new RuntimeException(msg); } } public static void checkFile(String filepath) { String[] lines = readStringArray(filepath); StringBuilder sb = new StringBuilder(); for (int i = 0; i < lines.length; ++i) { sb.append(lines[i]); } String content = sb.toString(); System.out.format("File %s correct? %b", filepath, check(content, 1000)); } public static void main(String[] args) { checkFile("Yourfile.java"); } }
java
You are not logged in and therefore you cannot submit a solution.