2012-09-04 35 views
-1

我遇到了方程求解器的一部分存在問題。我有一個保存後綴方程的對象數組,這個方法評估每個值。Java中的方程求解器 - 值未被壓入堆棧

我遇到的問題是,它崩潰告訴我,該列表是空的(在這一點上:雙NUM1 =((雙)operandStack.pop());)

有人能告訴我是什麼我在這裏做錯了?

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; 
} 
+1

您用什麼參數測試了該方法? –

+2

我的猜測是調用這個函數時堆棧是空的。你有沒有嘗試在調試器中逐句通過你的代碼? –

+1

您是否嘗試調試它? (在第一次迭代中檢查postfixQueue的內容,我打賭問題出在第一個元素類型中,而不是Double的實例,然後用空operandStack落入else情況) – aviad

回答

2

請參閱下面的代碼中的註釋。似乎是導致錯誤一個平凡的代碼路徑:

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)步,您可以識別,如果這是你的問題的根本原因。

+0

謝謝你。理論上postfixQueue中的第一項是雙打,我想我在拼湊postfixQueue時犯了一個錯誤。 – Dawson

+0

除非你的'DSAQueue'類提供了一個閃亮的'toString'方法,最簡單的方法是遍歷你的隊列併爲每個對象打印'toString'。請注意,如果我的答案已經解決了您的原始問題,那麼您應該[將其標記爲已接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)併發布額外的問題作爲單獨的問題(當然,經過深入研究)。 –