package com.ralf.stack.expr; import com.ralf.stack.MyStack; public class InfixExpr { String expr = null; private MyStack<String> operateStack = new MyStack<>(); private MyStack<Integer> numStack = new MyStack<>(); public InfixExpr(String expr) { this.expr = expr; } public float evaluate() { ExprIterator iterator = new ExprIterator(expr); while (iterator.hasNextOperate()) { String operateString = iterator.nextOperateString(); if (numStack.isEmpty()) { numStack.push(iterator.nextNumString()); numStack.push(iterator.nextNumString()); operateStack.push(operateString); } else if (operateStack.peek().equals("*") || operateStack.peek().equals("/")) { getOperatorAndNum(); operateStack.push(operateString); numStack.push(iterator.nextNumString()); } else { if (operateString.equals("+") || operateString.equals("-")) { getOperatorAndNum(); operateStack.push(operateString); numStack.push(iterator.nextNumString()); } else { numStack.push(iterator.nextNumString()); operateStack.push(operateString); } } } return getFinalResult(numStack,operateStack); } private void getOperatorAndNum() { String oper = operateStack.pop(); int secondNum = numStack.pop(); int firstNum = numStack.pop(); numStack.push(calculate(firstNum, secondNum, oper)); } private int getFinalResult(MyStack<Integer> numStack, MyStack<String> operateStack) { if (operateStack.isEmpty()) { return numStack.pop(); } getOperatorAndNum(); return getFinalResult(numStack, operateStack); } private int calculate(int firstNum, int secondNum, String oper) { int result; switch (oper) { case "+": result = firstNum + secondNum; break; case "-": result = firstNum - secondNum; break; case "*": result = firstNum * secondNum; break; case "/": result = firstNum / secondNum; break; default: result = 0; break; } return result; } public void getString() { ExprIterator iterator = new ExprIterator(expr); while (iterator.hasNextNum()) { System.out.print(iterator.nextNumString()); } while (iterator.hasNextOperate()) { System.out.print(iterator.nextOperateString()); } } }