将操作数<t>转换为整数

时间:2017-03-03 23:31:52

标签: java linked-list stack postfix

我正在使用自己实现的链接列表创建一个Postfix评估器方法,我真的在这里停留了。我需要通过pop返回最终的堆栈值。在我的方法中,我的返回类型必须是整数。我尝试了一个解决方案,它告诉我&#34;无法从Operand<Integer>转换为Integer&#34;。我认为我需要以某种方式转换它,但我不知道如何去做,任何帮助都会受到赞赏。

我找不到任何有用的东西,所以如果这是重复的话,我道歉。

这是我的方法:

public class ArithPostfixEvaluator implements PostfixEvaluator<Integer> {

    private final StackInterface<Operand<Integer>> stack;

    /**
     * Constructs an {@link ArithPostfixEvaluator}
     */
    public ArithPostfixEvaluator(){
        //Initialize the LinkedStack
        stack = new LinkedStack<>();
    }

    public Integer evaluate(String expr) throws IllegalPostfixExpressionException {

        ArithPostfixParser parser = new ArithPostfixParser(expr);
        for (Token<Integer> token : parser) {
            Type type = token.getType();
            switch(type){ 
            case OPERAND:
            //What to do when we see an operand?
                //create an operand variable
                Operand<Integer> operand = token.getOperand();
                //push the operand onto the stack
                stack.push(operand);
                break;
            case OPERATOR:
            //What to do when we see an operator?
                //create an operator variable
                Operator<Integer> operator = token.getOperator();
                //make a new operand called result
                Operand<Integer> result;   
                //pop 2 operands
                Operand<Integer> op1 = stack.pop();
                Operand<Integer> op2 = stack.pop();
                //the first operand goes in the second position
                operator.setOperand(2, op1);
                operator.setOperand(1, op2);
                //perform operation on result
                result = operator.performOperation();
                //push the result back onto the stack
                stack.push(result);
                break;
            default:
                throw new IllegalStateException("Parser returned an invalid Type: " + type);
            }                       
        }       
        // what to return?

        ///////////PROBLEM AREA////////////////

        Integer Finalval = stack.pop();
        //pop the remaining element on the stack
        return Finalval ;
    }

这是我的链接列表:

public class LinkedStack<T> implements StackInterface<T> {

    private LLNode<T> head;
    private int size;

    public T pop() throws StackUnderflowException {
    if(isEmpty()) throw new StackUnderflowException("Stack Underflow yo");
    T temp = head.getData();
    head = head.getNext();
    return temp;
    }

    public T top() throws StackUnderflowException {
        if(isEmpty()) throw new StackUnderflowException("Stack Underflow yo");
    return head.getData();
    }

    public boolean isEmpty() {
    return (head == null);
    }

    public int size() {
    return size;
    }

    public void push(T elem) {
        LLNode<T> newnode = new LLNode<T>(elem);
        newnode.setNext(head);
        head = newnode;
        size++;
    }

}

我的操作数和操作员课程:

public class Operand<T> {
    private final T value;

    public Operand(T value){
        this.value = value;
    }
    public T getValue(){
        return value;
    }
    public String toString() {
        return value.toString();
    }
}


public interface Operator<T> {

    public int getNumberOfArguments();

    public Operand<T> performOperation();

    public void setOperand(int position, Operand<T> operand);

}

1 个答案:

答案 0 :(得分:1)

private final StackInterface<Operand<Integer>> stack;

堆栈包含Operand<Integer> s,因此您无法执行此操作:

Integer Finalval = stack.pop();

尝试在Operand<Integer>变量中存储Integer。你可以这样做:

Integer Finalval = stack.pop().getValue();