Возникли проблемы с преобразованием номера объекта стека в int (Java)

Я пишу программу, которая преобразует выражение из инфикса в постфикс. У меня есть часть преобразования, но когда дело доходит до оценки постфиксного выражения, у меня возникают проблемы с преобразованием из char в int с использованием стека.

Я продолжаю получать сообщение об ошибке: «Исключение в потоке «основной» java.lang.ClassCastException: java.lang.Character не может быть приведен к java.lang.Integer»

Это может быть в этой части кода ниже, где проблема, но я не уверен:

  Integer x1 = (Integer)stack2.pop();
  Integer x2 = (Integer)stack2.pop();

Благодарю вас!

public class Calc {

/**
 * @param args the command line arguments
 */


public static void main(String[] args) {


System.out.println("Please enter your infix expression: ");    
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();

String postfix = "";
Stack<Character> stack = new Stack<Character>();

for(int i = 0; i < input.length(); i++){
    char subject = input.charAt(i);
    if (subject == '*'||subject == '+'||subject == '-'||subject == '/'){           
    while ((stack.empty() == false) && (order(stack.peek()) >= order(subject)))
      postfix += stack.pop() + " ";
      stack.push(subject);                
    }       
    else if(subject == '(')
    {
      stack.push(subject);
    }
    else if(subject == ')')
    {
      while(stack.peek().equals('(') == false){
      postfix += stack.pop() + " ";
    }
      stack.pop(); 
    }
    else{
        if((Character.isDigit(subject) == true) && ((i + 1) < input.length()) && (Character.isDigit(input.charAt(i+1)) == true))
        {
            postfix += subject;
        }
        else if(Character.isDigit(subject))
        {
            postfix += subject + " ";
        }   
        else
        {
            postfix += subject;
        }
    }
}

postfix += stack.pop();
System.out.println("Your post-fix expression is: " + postfix);

char subject2;
int yeah;

Stack stack2 = new Stack();
for (int j = 0; j < postfix.length(); j++){
    subject2 = postfix.charAt(j);
    if(Character.isDigit(subject2) == true){
         stack2.push(subject2);
    }
    if(subject2 == ' '){
        continue;
    }
    else{
        Integer x1 = (Integer)stack2.pop();
        Integer x2 = (Integer)stack2.pop();
        if (subject2 == '+'){
            yeah = x1 + x2;
        }
        if (subject2 == '-'){
            yeah = x1 - x2;
        }
        if (subject2 == '*'){
            yeah = x1 * x2;
        }
        if (subject2 == '/'){
            yeah = x1 / x2;
        }
        else {
            yeah = 0;
        }
    }
}
yeah = (int) stack2.pop();

System.out.println("The result is:" + yeah);


}
static int order(char operator)
{
    if(operator == '+' || operator =='-')
    return 1;
    else if(operator == '*' || operator == '/')
     return 2;
else
    return 0;
}
    }

person Jonny    schedule 07.04.2014    source источник
comment
Во-первых, не используйте необработанные типы.   -  person Sotirios Delimanolis    schedule 07.04.2014


Ответы (2)


Вы можете решить эту проблему, приведя к int. Обратите внимание, что int и Integer не одно и то же:

Integer x1 = (int) stack2.pop();
Integer x2 = (int) stack2.pop();
person Christian    schedule 07.04.2014
comment
Спасибо, это сработало! Но теперь я получаю сообщение об ошибке, что Exception in thread main java.util.EmptyStackException? Есть идеи, почему? - person Jonny; 07.04.2014
comment
Это означает, что вы пытаетесь извлечь элемент из пустого стека, что невозможно. - person Christian; 07.04.2014

при использовании информации о типе приведение не требуется

Stack<Integer> stack2 = new Stack<Integer>();
  …
  if(Character.isDigit(subject2) == true){
    stack2.push( Character.getNumericValue( subject2 ) );
  }
  …

чтобы предотвратить исключение пустого стека, я бы предпочел poll вместо pop
, чтобы было легче проверить состояние ошибки,
например. if( x1 == null ) System.err.println( "Your error message" );

Deque<Integer> stack2 = new ArrayDeque<Integer>();
  …
  Integer x1 = stack2.poll();
  Integer x2 = stack2.poll();
  …

кстати: программа синтаксически неверна, поскольку помещает в стек только одно значение

person Kaplan    schedule 17.10.2019