# Präfix in Infix Form umwandeln



## forsti222 (18. Mai 2011)

> Schreiben Sie einen Algorithmus boolean writeInfix(?char[] expr), der einen in Pra?fix- Notation gegebenen Ausdruck in Infix-Notation ausgibt. Der Ausdruck darf dabei nur aus den Operatoren +, –, * und / sowie den Kleinbuchstaben a-z bestehen. Die Zeichenkette expr ist null-terminiert, d.h. wird mit dem Zeichen chr(0) abgeschlossen.
> In der Ausgabe sollen alle Teilausdru?cke geklammert werden (wie in den Beispielen oben). Der Ru?ckgabewert des Algorithmus gibt an, ob die Umwandlung erfolgreich war (d.h. expr ein gu?ltiger Ausdruck in Pra?fix-Notation ist). Beim Auftreten eines Fehlers im gegebenen Ausdruck soll die Ausgabe sofort abgebrochen und false zuru?ckgegeben werden. Verwenden Sie gegebenenfalls einen Hilfsalgorithmus.



Das ist meine Aufgabenstellung habe mich schon etwas dran versucht


```
static boolean writeInfix(char[] expr) {
		String ausgabe = "";
		if(expr.length==1) {
			return true;
		}
		else
		{
			int i = 0;
			while(expr[i]== '+' ||expr[i]=='-' ||expr[i]== '/' ||expr[i]=='*' ) {
				ausgabe += "(";
				i++;
			}
			ausgabe+=expr[i] +""+expr[i-1]+""+expr[i+1];
			System.out.println(ausgabe);
			return true;
		}
	//	return false;
	}
```

Aber irgendwie komme ich nicht weiter wie das bei kompliziertern gehen soll? Kann mir Jemand helfen bzw auch sagen wie ich einfach das mit dem Zeichen überprüfen machen kann?

Danke euch!

lg


----------



## Technoblade (18. Mai 2011)

Naja, so ganz funktioniert dein Algorithmus nichtmals bei ganz einfachen. Gebe ich z.B. +23 ein bekomme ich als Ergebnis "(2+3" Da fehlt z.B. schon die geschlossene Klammer. Ein weiteres Problem ist, dass dein Algorithmus nur mit einstelligen Zahlen funktioniert, da du keine Trennzeichen hast. Das wäre das erste was ich dir empfehlen würdn, nimm dir das Leerzeichen als Trennzeichen, damit du auch mehrstellige Zahlen darstellen kannst. Die nächste Sache ist, dass du diesen Satz der Aufgabe ignoriert hast:



> Die Zeichenkette expr ist null-terminiert, d.h. wird mit dem Zeichen chr(0) abgeschlossen.



Gut, nun zu dem eigentlichen Problem. Anstelle eines Strings würde ich dir einen StringBuffer empfehlen, da du dort Zeichen mit Leichtigkeit überall einfügen kannst.
Ich würde dir auch empfehlen den Algorithmus rekursivzu implementieren und die Erlaubnis weitere Methoden zu verwenden ruhig anzunehmen, das verinfacht das ganze erheblich.
Versuch erstmal damit ein wenig weiterzukommen. Wenn du noch Fragen zum eigentlichen Algorithmus hast melde dich nochmal.


----------



## Technoblade (31. Mai 2011)

Naja, da die Aufgabe mittlerweile vermutlich schon abgeleuafen ist macht es auch keinen Unterschied wenn ich hier mal die Lösung poste für Leute die später nochmal hier rein gucken. hatte an dem Abend noch langeweile und hab es ein wenig abgewandelt ...:


```
public class Infix
{

    private static final String operands = "+-*/";
    private static final String numerics = "abcdefghijklmnopqrstuvwxyz0123456789";

    /**
     * Es wird davon ausgegangen, dass Zahlen durch ein Leerzeichen getrennt sind.
     */
    public static boolean writeInfix(char[] expr) {
        int erg = printNextTerm(expr, 0);
        System.out.println("");
        try {
            return erg > -1 && expr[erg + 1] == (char) 0;
        }
        catch(ArrayIndexOutOfBoundsException aioex) {
            return false;
        }
    }
    
    private static int printNextTerm(char[] expr, int offset) {
        int erg = 0;
        if(operands.contains(new String(expr, offset, 1))) {
            System.out.print("(");
            erg = printNextTerm(expr, offset + 1);
            if(erg == -1) {
                return -1;
            }
            System.out.print(expr[offset]);
            erg += printNextTerm(expr, offset + erg + 1);
            if(erg == -1) {
                return -1;
            }
            System.out.print(")");
            return erg;
        }
        if(expr[offset] == ' ') {
            erg = 1;
        }
        String number = nextNumeric(expr, offset + erg);
        if(number != null) {
            System.out.print(number);
            erg += number.length();
            return erg + 1;
        }
        return -1;
    }
    
    private static String nextNumeric(char[] expr, int offset) {
        StringBuffer sb = new StringBuffer();
        for(int i = offset; i < expr.length; i++) {
            if(numerics.contains(new String(expr, i, 1))) {
                sb.append(expr[i]);
            }
            else {
                break;
            }
        }
        return sb.length() == 0 ? null : sb.toString();
    }
}
```


----------

