JAVA You are to write a program name InfixToPostfixjava that
JAVA
 You are to write a program name InfixToPostfix.java that converts an infix expression entered by the user to a postfix expression. The expression may contain the following tokens:
 (1)   Integer constants (a series of decimal digits).
 (2)   x (representing a value to be supplied later).
 (3)   Binary operators (+, -, *, / and %).
 (4)   Parentheses
          
 Spaces between tokens are allowed but not required. The program will convert the expression to postfix form and display the converted expression. Upload the file into A7 folder of icollege.
 Sample Output:
 Enter infix expression: (x + 1) * (x – 2) / 4
 Converted expression: x 1 + x 2 - * 4 /
 Enter infix expression: 1 2 +
 Error in expression!! No operator between operands. Also last token must be an operand.
 Enter infix expression: 10.4
 Error in expression!! Cannot accept floating point numbers.
 
 Enter infix expression: 1 ( + 2)
 Error in expression!! No operator between operand and left parentheses.
 
 Enter infix expression: 5 – (x – 2))
 Error in expression!! No matching left parentheses for a right parentheses.
 
 Enter infix expression: 1 ** 2
 Error in expression!! The * operator cannot be preceded by a * operator.
Solution
Answer:
import java.util.*;
 import java.lang.*;
 import java.io.*;
public class InfixToPostfix
 {
    static Stack<Character> infxStk = new Stack<Character>();
     static ArrayList<Character> infxAry = new ArrayList<Character>();
    public static int optPrec(char aak)
    {
         if(aak == \'/\' || aak == \'%\' || aak == \'*\'){
         return 2;
         }
        else
         return 1;
     }
     public static void main(String args[])
    {    
    
   
     // Boolean variables
     boolean lstOpt = false;
     boolean lstOpnPar = false;
     boolean lsClsdParen = false;
     boolean lstIntg = false;
     boolean pvTkn = false;
   
     // scanner to read input
     Scanner myInfxScanner = new Scanner(System.in);
   
     // read expression
     System.out.println(\"Enter infix expression : \");
     String infxStr = myInfxScanner.nextLine();
    //extract characters
     char infx[] = infxStr.toCharArray();
   
     //checking operators between parenthesis
     if(infx[infx.length-1] == \'/\' || infx[infx.length-1] == \'*\' || infx[infx.length-1] == \'%\' ||
 infx[infx.length-1] == \'+\' || infx[infx.length-1] == \'-\'){
        //print error message
 System.out.println(\"Error in expression! No operator between operands.Also last token must be an operand .\");
 System.exit(0);
     }
   
     // checking operands
     if(infx[0] == \'/\' || infx[0] == \'*\' || infx[0] == \'%\' || infx[0] == \'+\' || infx[0] == \'-\'){
    //print error-msg
 System.out.println(\"Error in expression!! \");
 System.exit(0);
     }
   
 
     for(int kk = 0; kk < infxStr.length(); kk++)
    {
        //check for spaces
     if(infx[kk] == \' \')
        {
         continue;
     }
        //Get character at kk
     infx[kk] = infxStr.charAt(kk);
     switch(infx[kk]){
   
     // Check for integers
     case \'1\': case \'2\': case \'3\': case \'4\':
     case \'5\': case \'6\': case \'7\': case \'8\':
     case \'9\': case \'0\':
        //check if closed parentesis is encountered.
     if(lsClsdParen)
        {
     System.out.println(\"Error in expression!! An integer cannot directly follow a closed parenthesis.\");
     System.exit(0);
     }
    lstOpt = false;
     lstOpnPar = false;
     lsClsdParen = false;
     lstIntg = true;
        //add operand
     infxAry.add(infx[kk]);
     break;
   
     // check for spaces
     case \' \': continue;
        //check unknown-variable  
        case \'x\':
            //add operand
            infxAry.add(infx[kk]);
         break;
 
   
 
   
     // for operators
     case \'/\':
        case \'+\':
     case \'%\':
            //if operator is preceeded by an operator
    if (lstOpt){
    System.out.println(\"Error in expression! An operator cannot directly follow another operator.\");
                //exit
    System.exit(0);
    }
            //if operator is preceeded by paraenthesis
    if (lstOpnPar){
    System.out.println(\"Error in expression! \"+\"An operator cannot directly follow an open parenthesis.\");
                //exit
    System.exit(0);
    }
    lstOpt = true;
    lstOpnPar = false;
    lsClsdParen = false;
    lstIntg = false;
   
    while(!infxStk.isEmpty() && infxStk.peek() != \'(\' &&
 optPrec(infx[kk]) <= optPrec(infxStk.peek())){
    infxAry.add(infxStk.pop());
    }
    infxStk.push(infx[kk]);
    break;
        //for multiplication symbol
     case \'*\':
            //try
            try
            {
     while(!infxStk.isEmpty() && infxStk.peek() != \'(\' &&
 optPrec(infx[kk]) <= optPrec(infxStk.peek()))
                {
                    //add operand
    infxAry.add(infxStk.pop());
     }
                //push \"*\"
    infxStk.push(\'*\');
    break;
     }
            //catch
            catch(EmptyStackException expp)
            {
                //error on double \"*\"
     System.out.println(\"Error in expresion! The * operator cannot be preceded by a * operator.\");
                //exit
    System.exit(0);
     }
    //for -
     case \'-\':
            while(!infxStk.isEmpty() && infxStk.peek() != \'(\' &&
    optPrec(infx[kk]) <= optPrec(infxStk.peek()))
            {
                //add operand
        infxAry.add(infxStk.pop());
    }
            //add \"-\"
    infxStk.push(\'-\');
    break;
   
     // for parentesis
     case \'(\':
            infxStk.push(infx[kk]);
    lstOpt = false;
    lstOpnPar = true;
    lsClsdParen = false;
    lstIntg = false;
    break;
   
     case \')\':
            //check lstOpt is true
            if(lstOpt)
            {
         System.out.println(\"Error in expression! A closed parenthesis cannot directly follow an operator.\");
        System.exit(0);
         }
    lstOpt = false;
    lstOpnPar = false;
    lsClsdParen = true;
    lstIntg = false;
            //try
    try{
    while(infxStk.peek() != \'(\')
                {
                    //pop opertor and add it to operand array
        infxAry.add(infxStk.pop());
    }
                //pop operator
    infxStk.pop();
    break;
    }
            //catch
            catch(EmptyStackException expp)
            {
    System.out.println(\"Error in expression! No matching left parentheses for a right parentheses.\");
    System.exit(0);
    }
   
     // checking floating point numbers
     case \'.\':
            //print error-msg
            System.out.println(\"Error in expression! Cannot accept floating point numbers.\");
            //exit
 System.exit(0);
 
   
     // for illegal character
     default:
            //print error-msg
         System.out.println(\"Illegal character \"); break;
   
     }
     }
    //pop all operators from infxStk
     while(!infxStk.isEmpty())
    {
        //check error in left-parentesis
     if(infxStk.peek() == \'(\'){
         System.out.println(\"Error in expression! No matching right parenthesis for left parentehesis\");
         System.exit(0);
     }  
     infxAry.add(infxStk.pop());
     }
    //Converted expression
     System.out.print(\"Converted Expression: \");
    //print each operator & operand
     for(int kk = 0; kk < infxAry.size(); kk++)
        //print operator & operand
     System.out.print(infxAry.get(kk)+\" \");
 
     System.out.println();
 
   
 }
   
 
 
   
 
   
 }
Sample Output:
sh-4.3$ javac InfixToPostfix .java
sh-4.3$ java -Xmx128M -Xms16M InfixToPostfix
Enter infix expression :
10.4
Error in expression! Cannot accept floating point numbers.
sh-4.3$ java -Xmx128M -Xms16M InfixToPostfix
Enter infix expression :
1*2
Converted Expression: 1 2 *
sh-4.3$ java -Xmx128M -Xms16M InfixToPostfix
Enter infix expression :
1-( + 2)
Error in expression! An operator cannot directly follow an open parenthesis.





