package greendrm.simple.calculator; import java.util.LinkedList; import android.util.Log; public class SimpleCalculator { private final String TAG = "DJK"; private String mstrEquation; private final String OP = "*/+-"; private LinkedList<String>stackNumber = new LinkedList<String>(); private LinkedList<String>stackOperator = new LinkedList<String>(); public String calc(String str) { Calculate calculate = new Calculate(); char[] tmp;; int off = 0, len = 0; boolean bCal = false; boolean bEnd = false; boolean bFirst = true; mstrEquation = str; flushStack(); tmp = mstrEquation.toCharArray(); for (int i = 0; i < mstrEquation.length(); i++) { if (i == (mstrEquation.length() - 1)) { bEnd = true; len++; } for (int j = 0; j < OP.length(); j++) { if (bFirst && mstrEquation.charAt(i) == '-') break; if (mstrEquation.charAt(i) == OP.charAt(j) || bEnd) { stackNumber.addLast(String.valueOf(tmp, off, len)); bFirst = true; if (bCal) { String res = null; String op = stackOperator.removeLast(); if (op.equals("*")) { String a = stackNumber.removeLast(); String b = stackNumber.removeLast(); res = calculate.Mul(b, a); if (isError(res)) return res; } else if (op.equals("/")) { String a = stackNumber.removeLast(); String b = stackNumber.removeLast(); res = calculate.Div(b, a); if (isError(res)) return res; } if (res != null) stackNumber.addLast(res); bCal = false; } if (bEnd == false) { stackOperator.addLast(String.valueOf(OP.charAt(j))); off = i+1; len = -1; if (OP.charAt(j)== '*' || OP.charAt(j) == '/') { bCal = true; } if (mstrEquation.charAt(i+1) == '-'){ Log.d(TAG, ""+mstrEquation.charAt(i) + mstrEquation.charAt(i+1)); i++; len++; } } break; } } len++; bFirst = false; } while(stackOperator.size() > 0) { String op; String a; String b; String res = null; op = stackOperator.poll(); a = stackNumber.poll(); // first element b = stackNumber.poll(); if (op.equals("+")) { res = calculate.Add(a, b); if (isError(res)) return res; } else if (op.equals("-")) { res = calculate.Sub(a, b); if (isError(res)) return res; } if (res != null) stackNumber.addFirst(res); } return stackNumber.removeLast(); } private boolean isError(String res) { if (res.equals(Calculate.ERROR)) { flushStack(); return true; } else { return false; } } private void flushStack(LinkedList<String> stack) { while(stack.size() > 0) stack.removeLast(); } private void flushStack() { flushStack(stackNumber); flushStack(stackOperator); } }