private List<ExpressionAtom> parseInputPolynomial(String inputExpression) { inputExpression = identifyUnaryMinuses(inputExpression); inputExpression = insertMultiplicationSigns(inputExpression); List<ExpressionAtom> inputExpressionTokens = new ArrayList<ExpressionAtom>(); char[] inputChars = inputExpression.toCharArray(); for (int i = 0; i < inputChars.length; ++i) { if (isOperator(inputChars[i]) || inputChars[i] == '%') { inputExpressionTokens.add( new ExpressionAtom(String.valueOf(inputChars[i]), AtomType.OPERATOR, 1)); } else { int lastIndex = inputExpressionTokens.size() - 1; if (lastIndex >= 0 && inputExpressionTokens.get(lastIndex).getAtomType() == AtomType.OPERAND) { ExpressionAtom lastElement = inputExpressionTokens.remove(lastIndex); if (Character.isDigit(inputChars[i])) { lastElement.setCoefficient( lastElement.getCoefficient() * 10 + Character.getNumericValue(inputChars[i])); } else { lastElement.setVariablesOrOperator( lastElement.getVariablesOrOperator() + String.valueOf(inputChars[i])); } inputExpressionTokens.add(lastElement); } else if (Character.isDigit(inputChars[i])) { inputExpressionTokens.add( new ExpressionAtom("", AtomType.OPERAND, Character.getNumericValue(inputChars[i]))); } else { inputExpressionTokens.add( new ExpressionAtom(String.valueOf(inputChars[i]), AtomType.OPERAND, 1)); } } } return inputExpressionTokens; }
@Override public List<ExpressionAtom> evaluate( List<ExpressionAtom> loperands, List<ExpressionAtom> roperands) { if (roperands == null) { List<ExpressionAtom> product = new ArrayList<ExpressionAtom>(); for (int x = 0; x < loperands.size(); x++) { if (product.size() == 0) { product.add(loperands.get(x)); } else { ExpressionAtom atom = product.get(0); atom.setCoefficient(atom.getCoefficient() * loperands.get(x).getCoefficient()); String var = incrementDegree( loperands.get(x).getVariablesOrOperator(), atom.getVariablesOrOperator()); atom.setVariablesOrOperator(var); } } return product; } else { return multiple(loperands, roperands); } }