# Klammertest mit Stack implementieren



## franziska1986 (1. Mai 2006)

Hi.

Kann mir vielleicht jemand bei der Aufgabe helfen?


Aufgabe

Schreiben Sie mit Hilfe eines Stacks ein Programm, das einen Ausdruck auf korrekte Klammerung testet; dabei sollen die Klammern ()[]{} berücksichtigt werden. Stringliterale und Kommentare sollen dabei ignoriert werden. Ist ein Ausdruck nicht korrekt geklammert, soll Ihr Programm die mögliche Fehlerursache ausgeben. Testen Sie Ihre Implementierung mit Java-Quellcode-Dateien.

Hinweis: Die (geerbte) Methode read(char[] cbuf, int offset, int length) der Klasse java.io.FileReader erlaubt das zeichenweise Einlesen von Dateien.



Ansatz

Ich habe mal angefangen ein Programm zu schreiben (1. Teil - Stackprogramm lasse ich weg (das läuft)) 


```
import java.io.*; 
  
public class Klammer2 
{  
   public static void main(String args[]) 
   { 
	   
     Stack klammerstack = new Stack(10); 
     char[] buff = new char[100]; 
     
     try 
     { 
       FileReader in = new FileReader("TestDrive.txt"); 
       in.read(buff, 0, 100); 
     } 
     catch(IOException e) 
     { 
       System.out.println(e); 
     } 
     try 
     { 
       for(int i = 0; i < buff.length; i++) 
       { 
         if((buff[i] == '(') || (buff[i] == '[') || (buff[i] == '{')) 
         { 
           klammerstack.push(buff[i]); 
         } 
         else if(buff[i] == ')') 
         { 
           if(klammerstack.top() == '(') 
           { 
             klammerstack.pop(); 
           } 
           else 
           { 
             System.out.println("Fehler: ) ohne ("); 
           } 
         } 
         else if(buff[i] == ']') 
         { 
           if(klammerstack.top() == '[') 
           { 
             klammerstack.pop(); 
           } 
           else 
           { 
             System.out.println("Fehler: ] ohne ["); 
           } 
         } 
         else if(buff[i] == '}') 
         { 
           if(klammerstack.top() == '{') 
           { 
             klammerstack.pop(); 
           } 
           else 
           { 
             System.out.println("Fehler: } ohne {"); 
           } 
         } 
       } 
       if(!klammerstack.isEmpty()) 
       { 
         System.out.println("Stack noch nicht leer"); 
       } 
     } 
     catch(StackException e) 
     { 
       System.out.println(e + "\ngeschlossene Klammer ohne oeffnende"); 
     } 
   } 
 }
```

Leider weiß ich nicht wie ich das ganze so schreibe, dass Kommentare und Strings ausgelassen werden und wie ich es schaffe, dass am Ende ausgegeben wird, wieviele Klammer gefehlt haben.

Kann mir vielleicht jemand helfen? Bin für alle Tipps offen!


----------



## Johanness (2. Mai 2006)

Sieht doch schon ganz gut aus.
Um Kommentare und Strings zu ignorieren, musst Du Deine Methode kräftig erweitern:
- Bei einem " beginnt bzw. endet ein String, alles dazwischen wird ignoriert (Sonderfälle wie \" ignorieren wir mal, auch "\"" ist ein String).
- Wenn Du ein // einliest, und nicht in einem String bist, wird alles bis zum Zeilenende ignoriert
- /* und */ begrenzen ebenfalls einen Kommentar.

Johannes


----------



## Guest (2. Mai 2006)

Johanness hat gesagt.:
			
		

> Sieht doch schon ganz gut aus.
> Um Kommentare und Strings zu ignorieren, musst Du Deine Methode kräftig erweitern:
> - Bei einem " beginnt bzw. endet ein String, alles dazwischen wird ignoriert (Sonderfälle wie \" ignorieren wir mal, auch "\"" ist ein String).
> - Wenn Du ein // einliest, und nicht in einem String bist, wird alles bis zum Zeilenende ignoriert
> ...



Danke für deine Atnwort!

Aber wie sage, ich den meinem Programm dass er zum Beispiel ab einem // alles bis zum Zeilende ignoriert?

Vielen Dank.


----------



## norman (2. Mai 2006)

Anonymous hat gesagt.:
			
		

> Aber wie sage, ich den meinem Programm dass er zum Beispiel ab einem // alles bis zum Zeilende ignoriert?


wenn das eingelesene zeichen / ist, und das nächste auch, dann lese solange zeichen ein (und verwerfe sie wieder), bis die nächste zeile erreicht wird. (also \n oder sowas denk ich)...


----------



## Guest (2. Mai 2006)

Hmmmh  :bahnhof: 

Leider krieg ich das nicht hin.  
Kannst du mal ne Kurzimplementierung für mich liefern.

Danke!


----------



## norman (2. Mai 2006)

ungetestet:

```
if (buff[i] == '/') {
			if (buff[i+1] == '/') {
				for (int j=i; j<buff.length; j++) {
					if (buff[j]=='\n') {
						i=j+1; // hier wird zur nächsten zeile gesprungen
						break;
					}
			    }
			}
		}
```


----------

