Java中的方程求解器-未将值推送到堆栈上
我对方程求解器的一部分有问题。我有一个包含后缀方程的对象数组,这个方法计算每个值 我遇到的问题是,它崩溃了,告诉我列表此时为空:double num1=doubleoperanstack.pop 有人能告诉我我做错了什么吗Java中的方程求解器-未将值推送到堆栈上,java,Java,我对方程求解器的一部分有问题。我有一个包含后缀方程的对象数组,这个方法计算每个值 我遇到的问题是,它崩溃了,告诉我列表此时为空:double num1=doubleoperanstack.pop 有人能告诉我我做错了什么吗 DSAQueue<Object> postfixQueue = new DSAQueue<Object>(); . . . . private double evaluatePostfix (Queue<Object> post
DSAQueue<Object> postfixQueue = new DSAQueue<Object>();
.
.
.
.
private double evaluatePostfix (Queue<Object> postfixQueue)
{
DSAStack<Double> operandStack = new Stack<Double>();
while (postfixQueue.isEmpty() == false)
{
if (postfixQueue.peek() instanceof Double)
{
operandStack.push((Double)(postfixQueue.dequeue()));
}
else
{
double num1 = ((double)operandStack.pop());
double num2 = ((double)operandStack.pop());
char operator = ((char)postfixQueue.dequeue());
double result = executeOperation (operator, num1, num2);
operandStack.push(result);
}
}
double solution = operandStack.top();
return solution;
}
请参阅下面代码中的注释。似乎存在导致错误的琐碎代码路径:
DSAQueue<Object> postfixQueue = new DSAQueue<Object>();
private double evaluatePostfix (Queue<Object> postfixQueue)
{
// Here you define an empty list
DSAStack<Double> operandStack = new Stack<Double>();
while (postfixQueue.isEmpty() == false)
{
if (postfixQueue.peek() instanceof Double)
{
operandStack.push((Double)(postfixQueue.dequeue()));
}
else
{
// If the first item in postfixQueue was not a Double, you're now
// pop-ing from an empty stack
double num1 = ((double)operandStack.pop());
double num2 = ((double)operandStack.pop());
char operator = ((char)postfixQueue.dequeue());
double result = executeOperation (operator, num1, num2);
operandStack.push(result);
}
}
double solution = operandStack.top();
return solution;
}
如果按照Peter在评论中的建议使用调试器,您可以确定这是否是问题的根本原因。您使用了哪些参数测试了该方法?我猜调用该参数时堆栈是空的。您是否尝试过在调试器中单步执行代码?是否尝试过调试它?在第一次迭代中检查postfixQueue的内容,我打赌问题出在第一个元素类型中,它不是Double的实例,然后你陷入了操作数为空的else情况。这是一个方程计算器,不是方程求解器。谢谢。理论上,postfixQueue中的第一个项目将是双倍的,我想我在组合postfixQueue时犯了一个错误。除非您的DSAQueue类提供了一个闪亮的toString方法,否则最简单的方法可能是遍历队列并为每个对象打印toString。请注意,如果我的答案解决了您原来的问题,那么您当然应该在彻底研究之后,将任何其他问题作为单独的问题发布。