Stack Adding Machine no agrega, pero se cuelga a la espera de más argumentos.

así que tengo una pila que construí y tengo una máquina para evaluar expresiones como, (9 + 0) y pueden ser más complejas. Ejecuto de forma divertida la línea de comandos y luego, cuando escribo el ejemplo (9 + 5), el programa se queda ahí. Puedo obtener una nueva línea pero la expresión no evalúa. Así que mi pregunta es ¿qué me perdí? Estoy seguro de que hay algo que no he entendido correctamente y pensaba que me estaba perdiendo algo sobre el Escáner o sobre los arreglos en Java en general.

Tal vez pensé anoche que debería reemplazar los arreglos con ArrayList. ¿Esto tiene sentido?

Aquí está la pila de capacidad fija

public class FCStack<Item> {

private Item[] a; 
private int top; // pointer to top of Stack
private int capacity; // size of the Stack+1

public FCStack(int cap){
    capacity = cap;
    a = (Item[]) new Object[capacity];   
    top = 0;
}

public void push(Item i){ //will only push an Item to the Stack if there is room. 
    if (!isFull()) {
        a[top++] = i;
    }
}

public Item pop(){ //will only pop an Item from the stack if there is something to pop.
    if (!isEmpty()) {
        --top;
    }
    return a[top];
}

public boolean isFull(){ //returns true if is full
    return top == capacity;
}

public boolean isEmpty(){ //returns true if is empty
    return top == 0; 
}

public int size(){ //returns the current size of the stack+1 or the array index 
    return top;
}

}

Aquí está el evaluador de dos pilas

import java.io.*;
import java.util.Scanner;

public class TwoStackMaths {

public static void main (String[] args) {
    FCStack<String> ops = new FCStack<String>(10);
    FCStack<Double> vals = new FCStack<Double>(10);
    Scanner console = new Scanner(System.in);
    while(console.hasNext()) {
        String str = console.next();
        if (str.equals("("))
            ;
        else if (str.equals("+")) {
            ops.push(str);
        }
        else if (str.equals("-")) {
            ops.push(str);
        }
        else if (str.equals("*")) {
            ops.push(str); 
        }
        else if (str.equals("/")) {
            ops.push(str);
        }
        else if (str.equals("^")) {
            ops.push(str);
        }
        else if (str.equals(")")) {
            String op = ops.pop();
            double v = vals.pop();
            if (op.equals("+")) {
                v = vals.pop() + v;
            }
            else if (op.equals("-")) {
                v = vals.pop() - v;
            }
            else if (op.equals("*")) {
                v = vals.pop() * v;
            }
            else if (op.equals("/")) {
                v = vals.pop() / v;
            }
            else if (op.equals("^")) {
                v = Math.pow(v, vals.pop());
            }
            vals.push(v);
        }
        else {
        vals.push(Double.parseDouble(str));
        }
    }
    //console.close();
    System.out.println(vals.pop());
}

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta