Subato

BracketChecker

Stacks und Klammern

Ergänzen Sie in der Klasse BracketChecker die Methode boolean check(), 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. Verwenden Sie hierzu den vorgegebenen Stack: 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.


package de.hsrm.ads; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.LinkedList; import java.util.NoSuchElementException; public class BracketChecker { public static class Stack<T> { LinkedList<T> list; public Stack() { list = new LinkedList<T>(); } public void push(T e) { list.addFirst(e); } public void pop() throws NoSuchElementException { list.removeFirst(); } public T top() throws NoSuchElementException { return list.getFirst(); } public boolean isEmpty() { return list.isEmpty(); } } public static boolean check(String toCheck) { BracketChecker.Stack<Character> stack = new BracketChecker.Stack<Character>(); // 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) { // Ignoriere Leerzeilen und Kommentare if (s.length() != 0 && s.charAt(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)); } public static void main(String[] args) { checkFile("src/ads07/DLinkedPQueue.java"); } }
java
You are not logged in and therefore you cannot submit a solution.