package com.interview.flag.f; import java.util.Stack; /** * Created_By: stefanie * Date: 15-1-29 * Time: 下午4:48 */ public class F16_EquationSolver { private Integer[] equation; public F16_EquationSolver(String[] equation){ String[] normal = normalize(equation); this.equation = simplify(normal, normal.length); } public double solve(double X){ if(equation[2] == 0) return 0; double result = equation[0] + equation[1] * X; return -1 * result / equation[2]; } private String[] normalize(String[] equation){ String[] normal = new String[equation.length + 2]; int index = 0; while(index < equation.length && !equation[index].equals("=")) normal[index] = equation[index++]; if(index < equation.length){ normal[index++] = "-"; normal[index++] = "("; while((index - 1) < equation.length) normal[index] = equation[(index++ - 1)]; normal[index++] = ")"; } return normal; } private Integer[] simplify(String[] equation, int length){ Stack<Integer[]> stack = new Stack(); Stack<Integer> operators = new Stack(); Integer[] current = new Integer[]{0,0,0}; int flag = 1; for(int i = 0; i < length; i++){ if(equation[i].equals("+")) flag = 1; else if(equation[i].equals("-")) flag = -1; else if(equation[i].equals("(")){ stack.push(current); operators.push(flag); flag = 1; current = new Integer[]{0,0,0}; } else if(equation[i].equals(")")){ current = eval(stack.pop(), current, operators.pop()); } else { if(equation[i].endsWith("X")){ int number = getNumber(equation[i]); current[1] += flag * number; } else if(equation[i].endsWith("Y")){ int number = getNumber(equation[i]); current[2] += flag * number; } else { int number = Integer.parseInt(equation[i]); current[0] += flag * number; } flag = 1; } } return current; } private int getNumber(String str){ if(str.length() == 1) return 1; else return Integer.parseInt(str.substring(0, str.length() - 1)); } private Integer[] eval(Integer[] equ1, Integer[] equ2, int flag){ for(int i = 0; i < equ1.length; i++){ equ1[i] = equ1[i] + flag * equ2[i]; } return equ1; } public static void main(String[] args){ String[] equation = "3 + 2X + 5Y - ( 3 + 5X ) = 8 - 7Y + 2X".split("\\s"); F16_EquationSolver solver = new F16_EquationSolver(equation); System.out.println(solver.solve(10)); //4.833 System.out.println(solver.solve(-3)); //-0.583 equation = "4X + Y - 16 = 5X - 5Y + 4 - ( 3X + 5 )".split("\\s"); solver = new F16_EquationSolver(equation); System.out.println(solver.solve(10)); //-0.833 System.out.println(solver.solve(-3)); //3.5 } }