2013-09-27 121 views
0

我正在編寫一個評估Postfix表達式的代碼。數字非常大,所以我決定使用BigInteger。我應該將兩個數字存入鏈表並評估它們的總和,將結果存儲在第三個列表中,然後顯示答案。不過,我得到以下異常:java.lang.ClassCastException:java.math.BigInteger中不能轉換爲java.lang.Long中java.math.BigInteger不能轉換爲java.lang.Long

public static void pfEval(String exp) 
{ 
    Stack s2 = new Stack(); 
    int i=0; 
    BigInteger ans = BigInteger.valueOf(0); 
    BigInteger op1 = BigInteger.valueOf(0); 
    BigInteger op2 = BigInteger.valueOf(0); 
    while(i<exp.length()-1) 
    { 
     BigInteger op = BigInteger.valueOf(0); 
     if(exp.charAt(i) == ' ') 
      i++; 
     if((exp.charAt(i) >= '0')&&(exp.charAt(i) <= '9')) 
     { 
      while(exp.charAt(i) != ' ') 
      { 
       op = op.multiply(BigInteger.valueOf(10)); 
       op = op.add(BigInteger.valueOf(exp.charAt(i)-48)); 
       i++; 
      } 
      s2.push(op); 
     } 
     else 
     { 
      op1 = BigInteger.valueOf((long)s2.pop()); 
      op2 = BigInteger.valueOf((long)s2.pop()); 
      switch(exp.charAt(i)) 
      { 
      case '+': ans = addition(op2, op1); 
      break; 
      } 
      s2.push(ans); 
     } 
     i++; 
    } 
    System.out.println("Answer is "+s2.pop()); 
} 

這是新增功能:

public static BigInteger addition(BigInteger op2, BigInteger op1) 
{ 
    int i, j; 
    BigInteger base = BigInteger.valueOf(1000000); 
    BigInteger res = BigInteger.valueOf(0); 
    LinkedList l1 = new LinkedList(); 
    LinkedList l2 = new LinkedList(); 
    LinkedList l3 = new LinkedList(); 
    while(!op1.equals(0)) 
    { 
     l1.add(op1.mod(base)); 
     op1 = op1.divide(base); 
    } 
    while(!op2.equals(0)) 
    { 
     l2.add(op2.mod(base)); 
     op2 = op2.divide(base); 
    } 
    if(l1.size()<l2.size()) 
    { 
     for(i=0, j=0; i<l1.size(); i++, j++) 
     { 
      l3.add(((BigInteger)l1.get(i)).add((BigInteger)l2.get(i))); 
     } 
     while(j<l2.size()) 
     { 
      l3.add(l2.get(i)); 
     } 
    } 
    else if(l1.size()>l2.size()) 
    { 
     for(i=0, j=0; i<l2.size(); i++, j++) 
     { 
      l3.add(((BigInteger)l1.get(i)).add((BigInteger)l2.get(i))); 
     } 
     while(j<l1.size()) 
     { 
      l3.add(l1.get(i)); 
     } 
    } 
    else if(l1.size()==l2.size()) 
    { 
     for(i=0; i<l1.size(); i++) 
     { 
      l3.add(((BigInteger)l1.get(i)).add((BigInteger)l2.get(i)));     } 
    } 
    for(i=0; i<l3.size(); i++) 
    { 
     res = res.add(((BigInteger)l3.get(i)).multiply(base.pow(i))); 

    } 
    return res; 
} 

我不明白問題是什麼。誰能幫我?

回答

2

看這句話:

(long)s2.pop() 

然後回去,看看你是在棧上放什麼用s2.push()

,看看你是否能找出問題所在:>

+0

很微妙。謝謝! – usb

+2

@ user2785784請將其標記爲答案,如果您認爲它有幫助。 –

1

您應該是casting如下,

op1 = (BigInteger) s2.pop(); 
op2 = (BigInteger) s2.pop(); 

堆棧s2已經擁有BigInteger類型的對象,因此您需要使用類型BigInteger來投射它。

我建議你使用泛型集合,你的情況,而不是宣稱這樣,

Stack s2 = new Stack(); 

您可以如下定義,

Stack<BigInteger> s2 = new Stack<BigInteger>(); 

所以你可以避免不必要的casting。而且只需使用pop方法如下,

op1 = s2.pop(); 
op2 = s2.pop(); 
0

讓棧通用

Stack<BigInteger> s2= new Stack<>(); 

會有沒有必要鑄造

op1 = s2.pop(); 
相關問題