import java.util.Stack; public class Main { static int decider; static char checker; static Node root = null; public static void main(String[] args) { // Create the expression string String expressionString = "3+2*3"; // Convert it to a character array and call it 'infix' char[] infix = expressionString.toCharArray(); // pass the infix array in to the postfixer which is a // function to create the postfix form of the expression char[] postfix = postfixer(infix); System.out.println("The postfix form is: 3+2*6+1"); System.out.print("The infix form is: "); // Print the postfix array on the screen for (int i = 0; i < postfix.length && postfix[i] != '_'; i++) { System.out.print(postfix[i]); } // Create tree out of the postfix form Stack<Node> stack = new Stack<Node>(); for (int i = 0; i < postfix.length; i++) { Node node = new Node(postfix[i]); switch (postfix[i]) { case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': stack.push(node); System.out.println("Pushed"); break; case '+':case '-':case '/':case '*': System.out.println("Pushed"); node.right = stack.pop(); node.left = stack.pop(); stack.push(node); break; default: } } root = stack.pop(); System.out.println(root.left.data); // Solve the Values! Stack<NodeInt> intStack = new Stack<NodeInt>(); for (int i = 0; i < postfix.length; i++) { NodeInt nodeInt = new NodeInt(0); switch (postfix[i]) { case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': nodeInt = new NodeInt(Character.getNumericValue(postfix[i])); intStack.push(nodeInt); System.out.println(nodeInt.data); break; case '+': System.out.println("Pushed"); double x = intStack.pop().data; double y = intStack.pop().data; nodeInt.data = y + x; intStack.push(nodeInt); break; case '-': System.out.println("Pushed"); x = intStack.pop().data; y = intStack.pop().data; nodeInt.data = y - x; intStack.push(nodeInt); break; case '/': System.out.println("Pushed"); x = intStack.pop().data; y = intStack.pop().data; nodeInt.data = y / x; intStack.push(nodeInt); break; case '*': System.out.println("Pushed"); x = intStack.pop().data; y = intStack.pop().data; nodeInt.data = y * x; intStack.push(nodeInt); break; default: } } System.out.println(intStack.pop().data); } // function to convert postfix to infix public static char[] postfixer(char[] infix) { // create a new stack of character type Stack<Character> stack = new Stack<Character>(); // create an array 'result' which is the same length as of infix and // type char char[] result = new char[infix.length]; // initialize the value of the result array '_' for (int i = 0; i < result.length; i++) { result[i] = '_'; } // set count as the counter for the operations on result // increment after every use int count = 0; for (int i = 0; i < infix.length; i++) { // System.out.println(result); switch (infix[i]) { case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': result[count] = infix[i]; count++; break; case '(': stack.add(infix[i]); break; case ')': while ((!stack.empty()) && (stack.peek() == '(')) { stack.pop(); } if ((!stack.empty())) { result[count] = stack.pop(); count++; } break; case '+':case '*':case '-':case '/': while ((!stack.empty()) && (stack.peek() == '(')) { stack.pop(); } if ((!stack.empty())) { checker = stack.peek(); // if 0, same. if 1, more. if 2, less. checkPrecedence(infix[i], checker); if (decider == 1) { stack.add(infix[i]); } else { result[count] = stack.pop(); count++; stack.add(infix[i]); } } else { stack.add(infix[i]); } break; default: System.out.println("Invalid Data"); } } while ((!stack.empty())) { result[count] = stack.pop(); count++; } return result; } public static void checkPrecedence(char a, char b) { switch (a) { case '/': switch (b) { case '/':decider = 0;break; case '*':decider = 1;break; case '+':decider = 1;break; case '-':decider = 1;break; default: } break; case '*': switch (b) { case '/':decider = 2;break; case '*':decider = 0;break; case '+':decider = 1;break; case '-':decider = 1;break; default: } break; case '+': switch (b) { case '/':decider = 2;break; case '*':decider = 2;break; case '+':decider = 0;break; case '-':decider = 1;break; default: } break; case '-': switch (b) { case '/':decider = 2;break; case '*':decider = 2;break; case '+':decider = 2;break; case '-':decider = 0;break; default: } break; default: } } } class NodeInt { double data; NodeInt(double data) { this.data = data; } } class Node { char data; Node left; Node right; Node(char data) { this.data = data; } }