Stack Calculator: проблема оценки выражения постфикса из-за проблемы приведения - PullRequest
0 голосов
/ 18 ноября 2010

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

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

1 голос
/ 18 ноября 2010

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

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

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

parseInt не принимает Character в качестве аргумента, поэтому вам необходимо сначала преобразовать его в String, а затем в Integer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...