2010-11-18 1 views
0

Я работаю над домашним заданием, которое просит меня создать калькулятор, который изменяет выражение, данное ему от infix до postfix, чтобы затем оценить. Я должен сделать это с помощью стеков, но я могу выбрать любую реализацию стека, если я не использую java.util.Stack из JCF. Я выбрал ссылочный стек.Калькулятор стека: проблема с оценкой постфиксного выражения из-за проблемы с литьем

Проблема, с которой я столкнулся, заключается в моем методе метода calcPostfix. Чтобы оценить выражение, мне нужно было перевести мои переменные-операнды как целые, но 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

+0

Отслеживать исключение, поэтому нам не нужно угадывать, какой метод его выбрасывает. –

+0

О, извините! Он находится в файле calcPostfix() в первом случае: operand2 = (Integer) valueStack.pop(); – Bell

ответ

1

Да, вы не можете бросить персонаж в целое.

Для этого вы можете использовать,

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

ParseInt не принимает Характер в качестве аргумента так, вы должны преобразовать первое в строку, а затем Integer.

+0

Это сработало! Спасибо. Я буду использовать это и в будущем. знак равно – Bell

Смежные вопросы