/** Die Klasse "Infix" beinhaltet Methoden zum bearbeiten von mathematischen
Ausdrücken im sogenannten "Infix-Format".
Fabian Wleklinski 1999
**/

class Infix {
	
	/**
	Konvertiert einen String, der einen Ausdruck im Infix-Format enthält,
	in einen Postfix-Ausdruck-String
	**/
	public static String toPostfix( String src ) {
		// temporären Stack für die Operatoren anlegen
		Stack buf = new Stack( 20, 5 );
		String dest = new String();
		char c;
		// Den Quell-String von vorne nach hinten parsen. Dabei alle Ziffern in den
		// Ziel-String schreiben, und die Operatoren pushen. Nach jeder geschlossenen
		// Klammer einen Operator vom Stack poppen und in den Ziel-String schreiben
		
		for (int i=0; i < src.length(); i++) {
			// das nächste Zeichen aus dem Quell-String lesen
			c = src.charAt( i );
			// Alle Möglichkeiten durchgehen
			switch (c) {
				case '0' :
		    case '1' :
				case '2' :
				case '3' :
				case '4' :
				case '5' :
				case '6' :
				case '7' :
				case '8' :
				case '9' : {
					dest = dest + c;
					break;
				}
					
				case '+' : {
					buf.push( new Addition() );
					break;
				}
				case '-' : {
					buf.push( new Subtraction() );
					break;
				}
				case '*' : {
					buf.push( new Multiplication() );
					break;
				}
				case '/' : {
					buf.push( new Division() );
					break;
				}
					
				case '(' : break;
				case ')' : 
					// Operator vom Stack poppen, in den Ziel-String schreiben
					dest = dest + ((Operator) buf.pop()).getSymbol();
				
				case ' ' : break;
					
			  default : 
			  	// Fehler  -->  Exception
			  	throw new NoInfixExpressionException();
		  }
		}
		
		// Alle Operatoren, die jetzt noch auf dem Stack liegen, in den Ziel-String schreiben
		while (! buf.isEmpty() ) {
			// Operator vom Stack poppen, in den Ziel-String schreiben
			dest = dest + ((Operator) buf.pop()).getSymbol();
		}
		
		return dest;
	}
}

/** 
Die Klasse "NoInfixExpressionException" enthält eine Exception, die ausgelöst wird, wenn
versucht wird, Infix-Methoden auf einen String anzuwenden, der nicht als Infix erkannt
werden kann.
Fabian Wleklinski 1999.
**/

class NoInfixExpressionException extends RuntimeException {
  public NoInfixExpressionException()	{
  	super();
  }
}