0

我有这个程序可以评估 Java 中的 Lisp 表达式,但我遇到了一个奇怪的错误。

首先,这是程序:

import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;
import java.util.ArrayList;


class IterativeEvaluator
{ 
    private ExpressionScanner expression;

     public IterativeEvaluator (String expression)
    {
        this.expression = new ExpressionScanner(expression);
    }

    public double evaluate(Queue<Double> operandqueue)
    {
            // write your code here to create an explicit context stack
        Stack<Queue> temp_stack = new Stack<Queue>();

        char operator = ' ';
            double operand = 0.0;

            // write your code here to evaluate the LISP expression iteratively
            // you will need to use an explicit stack to push and pop context objects
        while ( expression.hasNextOperator() || expression.hasNextOperand() )
        {

            // Get the open bracket         

            if ( expression.hasNextOperator())    
                {
                operator = expression.nextOperator() ;
                if (operator == '(')
                { 
                    // if the stack is empty then the first bracket is trivial
                    // so this method will be instantiated by null
                    if (temp_stack.empty())
                        temp_stack.push(operandqueue);      
                    // else instantiate an arraylist(Queue)
                    else {
                        operandqueue = new LinkedList<Double>();
                        }
                }

                // push the list into the stack after the closing bracket appears       
                else if (operator == ')')
                {   
                    operand = calculate(operandqueue);
                    operandqueue = temp_stack.pop();
                    operandqueue.offer(operand);

                }
            // if it is another operator then it must be +,-,/,*
                else {
                    operator = expression.nextOperator();
                    operandqueue.offer( (double) operator );
                }
            }
            // else it is an operand so just put it in the queue
            else
                operandqueue.offer( (double) expression.nextOperand() ); 
        }
    return operand;
    }

        private double calculate(Queue<Double> some_queue)
        {
                char operator = (char) (some_queue.remove()).intvalue();
                double operand1 = 0;
                double operand2;            
                switch(operator){
                    case '+' :  while( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();  
                                operand1 = operand1 + operand2;         
                            }
                            break;

                    case '-' :  operand1 = some_queue.remove();
                            //checks for negative numbers
                            if (some_queue.isEmpty() )
                                operand1 = 0  -  operand1;
                            else{
                                while ( !some_queue.isEmpty() )
                                {
                                    operand2 = some_queue.remove();
                                    operand1 =  operand1 - operand2;
                                }
                            }
                            break;

                    case '*' :  operand1 = 1;
                            while ( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();
                                operand1 = operand1*operand2;
                            }
                            break;

                    case '/' :  operand1 = some_queue.remove();
                            if (some_queue.isEmpty() )
                                                    operand1 = 1/operand1 ;
                                                else{
                                                        while (!some_queue.isEmpty())
                                {
                                        operand2 = some_queue.remove();
                                    operand1 = operand1/operand2;                                                                                           }
                            }
                            break;
                }
            return operand1;
        }

    public static void main(String [] args)
    {
        String s =  
        "(+\t(- 6)\n\t(/\t(+ 3)\n\t\t(- \t(+ 1 1)\n\t\t\t3\n\t\t\t1)\n\t\t(*))\n\t(* 2 3 4))";  // = 16.5
        IterativeEvaluator myEvaluator = new IterativeEvaluator(s);
        System.out.println("Evaluating LISP Expression:\n" + s);
        System.out.println("Value is: " + myEvaluator.evaluate(null)); 
    }
}  /* 201340 */

编译期间的错误是:

IterativeEvaluator2.java:69: cannot find symbol
symbol  : method intvalue()
location: class java.lang.Double
                char operator = (char) (some_queue.remove()).intvalue();
                                                            ^
IterativeEvaluator2.java:69: inconvertible types
found   : java.lang.Double.intvalue
required: char
                char operator = (char) (some_queue.remove()).intvalue();
                                                                     ^
Note: IterativeEvaluator2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors

关于它为什么不起作用的任何建议?我试图表达

char operator = (char) ( (int) some_queue.remove()).intvalue();

但这并没有解决我的问题。谢谢

4

2 回答 2

2

方法名称中有拼写错误。“V”在intValue. 改变

intvalue();

intValue();
于 2013-11-14T20:30:05.597 回答
1
char operator = (char) (some_queue.remove()).intvalue();
                                            ^

三个问题:

  1. 的拼写错误intvalue():应该是intValue()
  2. 您的铸造(char) (some_queue.remove())将尝试铸造Doubleto charfirst:char是一种原始类型。您不能将其强制转换为类 type 的实例Double。而且,它不能有一个intValue()功能。

  3. some_queue是一个队列类型: Queue<Double>: 因此正确的方法是:

    char operator = (char)(some_queue.remove().intvalue());
                                                         ^
    
于 2013-11-14T20:40:10.067 回答