2010-11-18 10 views
0

Kendimi infix'ten postfix'e verilen ifadeyi değiştirip sonra değerlendiren bir hesap makinesi oluşturmamı isteyen bir ev ödevi üzerinde çalışıyorum. Yığınları kullanarak yapmalıyım ama JCF'den java.util.Stack'ı kullanmadığım sürece istediğim herhangi bir yığın uygulamasını seçebilirim. Başvurulan bir temel yığını seçtim.Yığın Hesaplayıcısı: Döküm sorunu nedeniyle postfix ifadesini değerlendirirken sorun

Yaşadığım sorun benim değerlendirmemde. İfadeyi değerlendirmek için, işlenen değişkenlerimi Tamsayılar olarak atamam gerekiyordu, ancak tutulma böyle görünmüyor. "Java.lang.Character java.lang.Integer için hata yapamıyor" hatasını alıyorum. Bu sorunu nasıl gidereceğimi bilmiyorum. Herhangi bir fikir sahibi olan var mı?

public class InfixToPostfixAndEvaluateCalculator { 

    private String infix; 
    private String postfix; 
    private int result; 

    public InfixToPostfixAndEvaluateCalculator() { 
    infix=null; 
    postfix=null; 
    result=0; 
    } 

    public InfixToPostfixAndEvaluateCalculator(String infix) { 
    this.infix=infix; 
    postfix=null; 
    result=0; 
    } 

    public String getInfix() { 
    return infix; 
    } 
    public String getPostfix() { 
    return postfix; 
    } 
    public int getresult() { 
    return result; 
    } 
    public void setInfix(String infix) { 
    this.infix=infix; 
    } 
    public void setPostfix(String postfix) { 
    this.postfix=postfix; 
    } 

    public String toString() { 
    return " Infix: "+infix+"\n Postfix: "+postfix+"\n Result: "+result+"\n"; 
    } 


    public String infixToPostfix() { //Carrano 2nd ed. p.354 
    //opStack is a stack of Character objects, such as '+','-','*','/', and ')' 
    StackInterface opStack=new StackReferenceBased(); 
    String postfixExp=""; //the expression to be built in this method 

    //for each character ch in the string infix 
    for (int i=0; i<infix.length(); i++) { 
     char ch=infix.charAt(i); 
     switch (ch) { 
     //if ch is an operator 
     case '+': case '-': case '*': case '/': 
      while ((!opStack.isEmpty()) 
      && (!opStack.peek().equals('(')) 
      && (precedence(ch) <= precedence((Character)opStack.peek()))){ 
      postfixExp = postfixExp + opStack.pop(); 
      } 
      opStack.push(ch); 
      break; 
     case '(': //add to stack 
      opStack.push(ch); 
      break; 
     case ')': //start popping things off the stack until you find opening parenthesis, use peak 
     while (!((Character)opStack.peek()).equals('(')){ 
      postfixExp = postfixExp + opStack.pop(); 

      }//end while 
      opStack.pop(); 
      break; 
     default: //ch is an operand 
      postfixExp = postfixExp + ch; 
      break; 
     }//end of switch 
    }//end of for 
    System.out.println("End of for loop."); 
    //append to postfixExp the operators remaining in the stack 
    while (! opStack.isEmpty()) { 
     postfixExp=postfixExp+((Character) opStack.pop()).charValue(); 
    }//end of while 

    postfix=postfixExp; //update the instance variable 
    return postfixExp; 
    }//end of infixToPostfix() 

    //little helper function to determine precedence value of an operator 
    // *,/ have value of, say 20 
    // +,- have value of, say 10 
    private int precedence(char ch) { 
    int prec = 20; 
    int prec2 = 10; 
    if (ch == '*' || ch == '/'){ 
    return prec; 
    } 
    if (ch == '+' || ch == '-'){ 
    return prec2; 
    } 
    return -1; 
    } 


    public int evaluatePostfix() { //Carrano 2nd ed. pp.350-351 
    //valueStack is a stack of Integer objects: 
    StackInterface valueStack=new StackReferenceBased(); 
    //variables for the operands: 
    int operand1, operand2; 
    //for each character ch in the string postfix 
    for (int i=0; i<postfix.length(); i++) { 
     char ch=postfix.charAt(i); 
     switch (ch) { 
     //if ch is an operator 
     case '+': 
      operand2 = (Integer)valueStack.pop(); 
      operand1 = (Integer)valueStack.pop(); 
      result = operand1 + operand2; 
      valueStack.push(result); 
      break; 
     case '-': 
      operand2 = (Integer)valueStack.pop(); 
      operand1 = (Integer)valueStack.pop(); 
      result = operand1 - operand2; 
      valueStack.push(result); 
      break; 
     case '*': 
      operand2 = (Integer)valueStack.pop(); 
      operand1 = (Integer)valueStack.pop(); 
      result = operand1 * operand2; 
      valueStack.push(result); 
      break; 
     case '/': 
      operand2 = (Integer)valueStack.pop(); 
      operand1 = (Integer)valueStack.pop(); 
      result = operand1/operand2; 
      valueStack.push(result); 
      break; 
     default: //ch is an operand 
      valueStack.push(ch); 
      break; 
     }//end of switch 
    }//end of for 
    //at the end, the value of the expression will be on the top of the stack 
    result=((Integer) valueStack.pop()).intValue(); 
    return result; 
    }//end of evaluatePostfix() 

} // end StackTest 
+1

Hata hangi satırda? – irrelephant

+0

Post istisna izleme, bu şekilde hangi yöntemin attığını tahmin etmemize gerek yok. –

+0

Oh Üzgünüm! İlk durumda sağdaPostfix() 'de bulunur: operand2 = (Tamsayı) valueStack.pop(); – Bell

cevap

1

Evet, tamsayı Karakter döküm olamaz:

İşte benim kodudur. kendinizin kullanabileceği

Integer.parseInt(String.valueOf(valueStack.pop())); 

parseInt böylece argüman olarak Karakter almaz yapmak için, Tamsayı ilk Dizesi'ne ve sonra dönüştürmek zorunda.

+0

Bu işe yaradı! Teşekkür ederim. Bunu gelecekte de kullanacağım. =) – Bell