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);
   }
 }