2010-11-18 59 views
0

我正在做一个家庭作业任务,要求我创建一个计算器,将给定的表达式从中缀改为postfix,然后进行评估。我必须使用堆栈,但可以选择任何我希望的堆栈实现,只要我不使用JCF中的java.util.Stack即可。我选择了一个基于引用的堆栈。Stack计算器:由于铸造问题而无法评估后缀表达式

我遇到的问题是在我的evaluatePostfix方法。为了评估表达式,我必须将我的操作数变量作为整数来投射,但eclipse似乎并不那么喜欢。我不断收到“java.lang.Character不能转换为java.lang.Integer”错误。我不知道如何解决这个问题。有没有人有任何见解?

这里是我的代码:

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

哪一行是错误? – irrelephant 2010-11-18 00:43:56

+0

发布异常跟踪,这样我们就不用猜测是什么方法抛出它了。 – 2010-11-18 00:45:58

+0

哦,对不起!它在evaluatePostfix()正确的第一种情况下:operand2 =(Integer)valueStack.pop(); – Bell 2010-11-18 17:35:26

回答

1

是的,你可以不投人品整数。

要做到这一点,您可以使用,

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

parseInt函数不走字作为参数,因此,你必须先转换成String,然后转换为整数。

+0

这工作!谢谢。我将来也会使用它。 =) – Bell 2010-11-18 17:33:35