* @param expression: an array of strings;
public int evaluateExpression(String[] expression) {
Stack<Integer> nums = new Stack<>();
Stack<String> operators = new Stack<>();
for (int i = 0; i < expression.length; i++) {
String c = expression[i];
else if (c.equals(")")) {
while (!operators.isEmpty() && !operators.peek().equals("(")) {
nums.push(calculate(nums.pop(), nums.pop(), operators.pop()));
operators.pop(); // remove "("
while (!operators.isEmpty() && hasPrecedence(c, operators.peek())) {
nums.push(calculate(nums.pop(), nums.pop(), operators.pop()));
nums.push(Integer.valueOf(c));
while (!operators.isEmpty()) {
nums.push(calculate(nums.pop(), nums.pop(), operators.pop()));
return nums.isEmpty() ? 0 : nums.pop();
public boolean isOperator(String c) {
return c.equals("*") || c.equals("/") || c.equals("+") || c.equals("-")
|| c.equals("(") || c.equals(")");
public int calculate(int num1, int num2, String op) {
// Check if op2 has a higher precedence
public boolean hasPrecedence(String op1, String op2) {
if (op2.equals("*") || op2.equals("/")) {
else if (op2.equals("+") || op2.equals("-")) {
if (op1.equals("*") || op1.equals("/")) {