Code
@PostMapping("/calculator")
public String calculatorProc(HttpServletRequest req, HttpSession session, Model model) {
String num_ = req.getParameter("num");
String op_ = req.getParameter("op");
Object obj = session.getAttribute("stack");
Stack<String> stack = (obj == null) ? new Stack<>() : (Stack) obj;
if (num_ != null) {
if (stack.isEmpty()) {
stack.push(num_);
} else {
String element = stack.pop();
if (element.equals("/") || element.equals("*")
|| element.equals("-") || element.equals("+")) {
stack.push(element);
stack.push(num_);
} else {
num_ = element + num_;
stack.push(num_);
}
}
session.setAttribute("stack", stack);
model.addAttribute("eval", getEval(stack));
} else if (op_ != null && !op_.equals("=")) {
if (op_.equals("C")) {
if (stack.isEmpty())
;
else {
String s = stack.pop();
if (s.length() > 1) {
s = s.substring(0, s.length() - 1);
stack.push(s);
}
}
} else
stack.push(op_);
session.setAttribute("stack", stack);
model.addAttribute("eval", getEval(stack));
} else {
int result = 0;
int num2 = Integer.parseInt(stack.pop());
String op = stack.pop();
int num1 = Integer.parseInt(stack.pop());
switch (op) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = (int) (num1 / num2);
break;
default:
result = 0;
}
session.removeAttribute("stack");
model.addAttribute("eval", result);
}
return "08.calculator";
}
String getEval(Stack<String> stack) {
String eval = "";
for (String s : stack)
eval += s + " ";
return eval;
}