Advertisement
Guest User

Expression Evaluator

a guest
Apr 9th, 2016
681
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.36 KB | None | 0 0
  1. import java.util.Stack;
  2.  
  3. public class ExpressionEvaluator {
  4.     private String expression;
  5.     private String[] expList;
  6.     private String[] operators = {"√", "x", "/", "+", "-"};
  7.     private String[] operands = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
  8.     private Stack expressStack;
  9.  
  10.     public ExpressionEvaluator(String expression){
  11.         this.expression = expression;
  12.         //Creates stack for later usage when solving expression
  13.         expressStack = new Stack();
  14.         //Creates new array the length of expression split.
  15.         expList = new String[this.expression.split(" ").length];
  16.  
  17.         //Add each element from the expression split to the new Array
  18.         for(int i = 0; i < this.expression.split(" ").length; i++){
  19.             expList[i] = this.expression.split(" ")[i];
  20.         }
  21.     }
  22.  
  23.     //Solve
  24.     public double solve(){
  25.         double answer = 0;
  26.         String postFixExpression = parse(expression);
  27.         String[] postFixSolve = new String[postFixExpression.length()];
  28.  
  29.         for(int i = 0; i < postFixSolve.length; i++){
  30.             postFixSolve[i] = postFixExpression.split(" ")[i];
  31.         }
  32.  
  33.         for(int i = 0; i < postFixSolve.length; i++){
  34.             String currentElement = postFixSolve[i];
  35.  
  36.             if(isOperand(currentElement)){
  37.                 expressStack.push(Double.parseDouble(currentElement));
  38.             }else if(isOperator(currentElement)){
  39.                 double num1 = (double)expressStack.pop();
  40.                 double num2 = (double)expressStack.pop();
  41.  
  42.                 switch(currentElement){
  43.                     case "x":
  44.                         expressStack.push(num1 * num2);
  45.                         break;
  46.                     case "/":
  47.                         expressStack.push(num1 / num2);
  48.                         break;
  49.                     case "+":
  50.                         expressStack.push(num1 + num2);
  51.                         break;
  52.                     case "-":
  53.                         expressStack.push(num1 - num2);
  54.                         break;
  55.                 }
  56.             }
  57.         }
  58.  
  59.         System.out.println((double)expressStack.pop());
  60.  
  61.         return answer;
  62.     }
  63.  
  64.     //Convert expression to post-fix
  65.     public String postFixIt(){
  66.         String postFixed; //Return value
  67.         StringBuilder sb = new StringBuilder();
  68.         Stack<String> myStack = new Stack<>();
  69.  
  70.         int numOfOperands = 0;
  71.  
  72.         for(int i = 0; i < expList.length; i++){
  73.             String currentElement = parse(expList[i]);
  74.  
  75.             if(isOperand(currentElement)){
  76.                 sb.append(currentElement + " ");
  77.                 numOfOperands++;
  78.             }else if(isOperator(currentElement) && myStack.isEmpty()){
  79.                 myStack.push(currentElement);
  80.             }
  81.  
  82.             if(numOfOperands == 2){
  83.                 sb.append(myStack.pop() + " ");
  84.                 numOfOperands = 1;
  85.             }
  86.         }
  87.  
  88.         postFixed = sb.toString().trim();
  89.  
  90.         return postFixed;
  91.     }
  92.  
  93.     public int comparePrecedence(String op1, String op2){
  94.         int returnVal = 0;
  95.  
  96.        
  97.  
  98.         return returnVal;
  99.     }
  100.  
  101.     //Checks to see if it is a number
  102.     public boolean isOperand(String testOperand){
  103.  
  104.         for(String operand : operands){
  105.             if(testOperand.contains(operand))
  106.                 return true;
  107.         }
  108.  
  109.         return false;
  110.     }
  111.  
  112.     //Checks to see if it is a operator
  113.     public boolean isOperator(String testOperator){
  114.  
  115.         for(String operator : operators){
  116.             if(testOperator.equals(operator))
  117.                 return true;
  118.         }
  119.  
  120.         return false;
  121.     }
  122.  
  123.     //Parses a string that is given to it
  124.     public String parse(String parseString){
  125.         String parsed;
  126.         StringBuilder sb = new StringBuilder();
  127.  
  128.         if(parseString.contains("(") || parseString.contains(")")){
  129.             String[] parseStringList = parseString.split("");
  130.             for(String parse : parseStringList){
  131.                 if(parse.equals("(") || parse.equals(")")){
  132.                     System.out.print(".");
  133.                 }else{
  134.                     sb.append(parse);
  135.                 }
  136.             }
  137.  
  138.             parsed = sb.toString().trim();
  139.         }else{
  140.             parsed = parseString.trim();
  141.         }
  142.  
  143.         return parsed;
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement