// infix.java // converts infix arithmetic expressions to postfix // to run this program: C>java InfixApp import java.io.*; // for I/O //////////////////////////////////////////////////////////////// class StackX { privateint maxSize; privatechar[] stackArray; privateint top; //-------------------------------------------------------------- public StackX(int s) // constructor { maxSize = s; stackArray =newchar[maxSize]; top =-1; } //-------------------------------------------------------------- publicvoid push(char j) // put item on top of stack { stackArray[++top] = j; } //-------------------------------------------------------------- publicchar pop() // take item from top of stack { return stackArray[top--]; } //-------------------------------------------------------------- publicchar peek() // peek at top of stack { return stackArray[top]; } //-------------------------------------------------------------- publicboolean isEmpty() // true if stack is empty { return (top ==-1); } //------------------------------------------------------------- publicint size() // return size { return top+1; } //-------------------------------------------------------------- publicchar peekN(int n) // return item at index n { return stackArray[n]; } //-------------------------------------------------------------- publicvoid displayStack(String s) { System.out.print(s); System.out.print("Stack (bottom-->top): "); for(int j=0; j<size(); j++) { System.out.print( peekN(j) ); System.out.print(''); } System.out.println(""); } //-------------------------------------------------------------- }// end class StackX //////////////////////////////////////////////////////////////// class InToPost // infix to postfix conversion { private StackX theStack; private String input; private String output =""; //-------------------------------------------------------------- public InToPost(String in) // constructor { input = in; int stackSize = input.length(); theStack =new StackX(stackSize); } //-------------------------------------------------------------- public String doTrans() // do translation to postfix { for(int j=0; j<input.length(); j++) // for each char { char ch = input.charAt(j); // get it theStack.displayStack("For "+ch+""); // *diagnostic* switch(ch) { case'+': // it's + or - case'-': gotOper(ch, 1); // go pop operators break; // (precedence 1) case'*': // it's * or / case'/': gotOper(ch, 2); // go pop operators break; // (precedence 2) case'(': // it's a left paren theStack.push(ch); // push it break; case')': // it's a right paren gotParen(ch); // go pop operators break; default: // must be an operand output = output + ch; // write it to output break; }// end switch }// end for while( !theStack.isEmpty() ) // pop remaining opers { theStack.displayStack("While "); // *diagnostic* output = output + theStack.pop(); // write to output } theStack.displayStack("End "); // *diagnostic* return output; // return postfix }// end doTrans() //-------------------------------------------------------------- publicvoid gotOper(char opThis, int prec1) { // got operator from input while( !theStack.isEmpty() ) { char opTop = theStack.pop(); if( opTop =='(' ) // if it's a '(' { theStack.push(opTop); // restore '(' break; } else// it's an operator { int prec2; // precedence of new op if(opTop=='+'|| opTop=='-') // find new op prec prec2 =1; else prec2 =2; if(prec2 < prec1) // if prec of new op less { // than prec of old theStack.push(opTop); // save newly-popped op break; } else// prec of new not less output = output + opTop; // than prec of old }// end else (it's an operator) }// end while theStack.push(opThis); // push new operator }// end gotOp() //-------------------------------------------------------------- publicvoid gotParen(char ch) { // got right paren from input while( !theStack.isEmpty() ) { char chx = theStack.pop(); if( chx =='(' ) // if popped '(' break; // we're done else// if popped operator output = output + chx; // output it }// end while }// end popOps() //-------------------------------------------------------------- }// end class InToPost //////////////////////////////////////////////////////////////// class InfixApp { publicstaticvoid main(String[] args) throws IOException { String input, output; while(true) { System.out.print("Enter infix: "); System.out.flush(); input = getString(); // read a string from kbd if( input.equals("") ) // quit if [Enter] break; // make a translator InToPost theTrans =new InToPost(input); output = theTrans.doTrans(); // do the translation System.out.println("Postfix is "+ output +'\n'); }// end while }// end main() //-------------------------------------------------------------- publicstatic String getString() throws IOException { InputStreamReader isr =new InputStreamReader(System.in); BufferedReader br =new BufferedReader(isr); String s = br.readLine(); return s; } //-------------------------------------------------------------- }// end class InfixApp ////////////////////////////////////////////////////////////////